1.eval()函数
参数: source:一个Python表达式或函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意map对象
a = '[1,2,3]' eval(a)Out[2]:
[1, 2, 3]In [3]:
a = '1' b = 3 eval(a) + bOut[3]:
4In [4]:
a = 10 eval("a+1")Out[4]:
11In [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)
6In [18]:
add(1, 2, 3, 4, 5)
15In [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)
6In [24]:
t = (2, 3, 4)In [25]:
demo(*t)
9In [26]:
dic = {1: 'a', 2: 'b', 3: 'c'} demo(*dic)
6In [27]:
demo(*dic.values())
abc
5.函数参数和返回值的类型指定和检查
在python3.5之后,就新增了对函数参数和返回值的类型指定和检查,以及在新建变量时也可以指定类型。
例如,下面这个函数test,指定了输入参数a为int类型,而b为str类型,并且返回值为srt类型。可以看到,
在方法中,我们最终返回了一个int,此时pycharm就会有警告;
当我们在调用这个方法时,参数a我们输入的是字符串,此时也会有警告;
但非常重要的一点是,pycharm只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言
def test(a: int, b: str)-> int: return str(a) + bIn [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 intIn [35]:
test(1, '2')Out[35]:
'12'