参数: source:一个Python表达式或函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意map对象
a = '[1,2,3]'
eval(a)
a = '1'
b = 3
eval(a) + b
a = 10
eval("a+1")
a = 10
g = {'a': 4}
eval("a+1", g)
这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,我们在 eval中提供了globals参数,这时候eval的作用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,所以使用了a为4的值。
a = 10
b = 20
c = 30
g = {'a': 6, 'b': 8}
t = {'b': 100, 'c': 10}
eval('a+b+c', g, t)
这里面就更有点绕人了,此次执行的结果中,a是6,b是100,c是10。我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,当前指定的小的作用域会覆盖以前大的作用域,这可以理解为一张小的纸盖在了一张大的纸上,纸是透明的,上面写的东西是不透明的,而它们重合的地方就可以理解成两个作用域冲突的地方,自然是小的显现出来了。
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
a[::-1] # 逆序列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[::-1]
隔一个元素取一个元素,获取偶数位置的元素
a[::-2]
a[::2]
隔一个元素取一个元素,获取奇数位置的元素
a[1::2]
可变参数在定义函数时,主要有两种形式* para和** para,前者用来接收任意多个实参,并放入一个元组中;后者接收类似于关键参数一样显示赋值形式的任意多个实参,并放入一个字典中。
def fun(*p):
print(p)
fun(1, 2, 3)
fun(12, 12, 13, 14)
def add(*p):
sum = 0
for i in p:
sum += i
print(sum)
add(1, 2, 3)
add(1, 2, 3, 4, 5)
def fun_dic(**p):
print(p)
fun_dic(a=1, b=2)
调用含有多个参数的函数时,可以使用python列表、元组、集合、字典及其他可迭代对象作为实参,并在实参命名前加一个*,python解释器将自动进行解包,然后传递给多个单变量形参。
def demo(a, b, c):
print(a + b + c)
seq = [1, 2, 3]
demo(*seq)
t = (2, 3, 4)
demo(*t)
dic = {1: 'a', 2: 'b', 3: 'c'}
demo(*dic)
demo(*dic.values())
在python3.5之后,就新增了对函数参数和返回值的类型指定和检查,以及在新建变量时也可以指定类型。
例如,下面这个函数test,指定了输入参数a为int类型,而b为str类型,并且返回值为srt类型。可以看到,
在方法中,我们最终返回了一个int,此时pycharm就会有警告;
当我们在调用这个方法时,参数a我们输入的是字符串,此时也会有警告;
但非常重要的一点是,pycharm只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言
def test(a: int, b: str)-> int:
return str(a) + b
test(1, 2)
test(1, '2')