python基础知识

 

1.eval()函数

 

参数: source:一个Python表达式或函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意map对象

In [2]:
a = '[1,2,3]'
eval(a)
Out[2]:
[1, 2, 3]
In [3]:
a = '1'
b = 3
eval(a) + b
Out[3]:
4
In [4]:
a = 10
eval("a+1")
Out[4]:
11
In [5]:
a = 10
g = {'a': 4}
eval("a+1", g)
Out[5]:
5
 

这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,我们在 eval中提供了globals参数,这时候eval的作用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,所以使用了a为4的值。

In [6]:
a = 10
b = 20
c = 30
g = {'a': 6, 'b': 8}
t = {'b': 100, 'c': 10}
eval('a+b+c', g, t)
Out[6]:
116
 

这里面就更有点绕人了,此次执行的结果中,a是6,b是100,c是10。我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,当前指定的小的作用域会覆盖以前大的作用域,这可以理解为一张小的纸盖在了一张大的纸上,纸是透明的,上面写的东西是不透明的,而它们重合的地方就可以理解成两个作用域冲突的地方,自然是小的显现出来了。

 

2.切片

In [8]:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a[::-1]  # 逆序列表
Out[8]:
[9, 8, 7, 6, 5, 4, 3, 2, 1]
In [9]:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[::-1]
Out[9]:
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
 

隔一个元素取一个元素,获取偶数位置的元素

In [10]:
a[::-2]
Out[10]:
[10, 8, 6, 4, 2]
In [11]:
a[::2]
Out[11]:
[1, 3, 5, 7, 9]
 

隔一个元素取一个元素,获取奇数位置的元素

In [12]:
a[1::2]
Out[12]:
[2, 4, 6, 8, 10]
 

3.函数中的可变参数

 

可变参数在定义函数时,主要有两种形式* para和** para,前者用来接收任意多个实参,并放入一个元组中;后者接收类似于关键参数一样显示赋值形式的任意多个实参,并放入一个字典中。

In [13]:
def fun(*p):
    print(p)
In [14]:
fun(1, 2, 3)
 
(1, 2, 3)
In [15]:
fun(12, 12, 13, 14)
 
(12, 12, 13, 14)
In [16]:
def add(*p):
    sum = 0
    for i in p:
        sum += i
    print(sum)
In [17]:
add(1, 2, 3)
 
6
In [18]:
add(1, 2, 3, 4, 5)
 
15
In [19]:
def fun_dic(**p):
    print(p)
In [20]:
fun_dic(a=1, b=2)
 
{'a': 1, 'b': 2}
 

4.传递参数时的时序解包

 

调用含有多个参数的函数时,可以使用python列表、元组、集合、字典及其他可迭代对象作为实参,并在实参命名前加一个*,python解释器将自动进行解包,然后传递给多个单变量形参。

In [21]:
def demo(a, b, c):
    print(a + b + c)
In [23]:
seq = [1, 2, 3]
demo(*seq)
 
6
In [24]:
t = (2, 3, 4)
In [25]:
demo(*t)
 
9
In [26]:
dic = {1: 'a', 2: 'b', 3: 'c'}
demo(*dic)
 
6
In [27]:
demo(*dic.values())
 
abc
 

5.函数参数和返回值的类型指定和检查

 

在python3.5之后,就新增了对函数参数和返回值的类型指定和检查,以及在新建变量时也可以指定类型。

 

例如,下面这个函数test,指定了输入参数a为int类型,而b为str类型,并且返回值为srt类型。可以看到,
在方法中,我们最终返回了一个int,此时pycharm就会有警告;
当我们在调用这个方法时,参数a我们输入的是字符串,此时也会有警告;
但非常重要的一点是,pycharm只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言

In [33]:
def test(a: int, b: str)-> int:
    return str(a) + b
In [34]:
test(1, 2)
 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-34-f4ef31738bb7> in <module>()
----> 1test(1, 2)

<ipython-input-33-66586b09db06> in test(a, b)
      1 def test(a: int, b: str)-> int:
----> 2return str(a) + b

TypeError: must be str, not int
In [35]:
test(1, '2')
Out[35]:
'12'
上一篇:Advanced Techniques in Logic Synthesis, Optimizations and Applications


下一篇:python中的eval()函数