初步了解函数作用域和补充非可变类型参数的函数与可变类型参数的函数
函数作用域
模块定义全局作用域
函数定义本地作用域
1内嵌的模块是全局作用域
2全局作用域的作用范围仅限于单个文件
3每次对函数的调用都创建一个新的本地作用域
4在函数中赋值的变量名除非特别声明为全局变量,否则均为本地变量
5所有的变量名都可以归纳为本地,全局,内置
普通函数(非可变参数函数)的参数类型虽然不定,但是参数的数量是一定的。调用函数是传进去的“实参”数量必须与函数定义中的“形参”数量一致,不能多也不能少,不然会引发类型错误:
>>> def func(arg):
print arg
>>> func(3)
3
>>> func()
Traceback (most recent call last):
File "<pyshell#72>", line 1, in <module>
func()
TypeError: func() takes exactly 1 argument (0 given)
>>> func(1,2)
Traceback (most recent call last):
File "<pyshell#73>", line 1, in <module>
func(1,2)
TypeError: func() takes exactly 1 argument (2 given)
至于“非可变参数”的函数,分两种:
单星号参数(*arg),笔记中好像有点误解哦,它代表的并不是两个参数,而是0个或多个,不限量的。传进去的参数实际上被存储在一个临时的“元组(Tuple)”中,看例子:
>>> def f1(*x):
if len(x) == 0:
print 'None!'
else:
print x
>>> f1()
None!
>>> f1(1,'s','fun')
(1, 's', 'fun')
>>> f1(k=1,l=2)
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
f1(k=1,l=2)
TypeError: f1() got an unexpected keyword argument 'k'
第二种可变类型参数的函数就是“双星号参数”(**args)。这种形式其实函数内部将参数存储在临时的一个字典中,传参数的形式必须是func(arg1=val1,arg2=val2...),不然也会引发类型错误,看例子:
>>> def f2(**arg):
if len(arg) == 0:
print 'None!'
else:
print arg
>>> f2()
None!
>>> f2(x=1,y=2)
{'y': 2, 'x': 1}
>>> f2(4,5)
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
f2(4,5)
TypeError: f2() takes exactly 0 arguments (2 given)
>>> def f3(arg1,*arg2,**arg3):
print 'arg1:',arg1
if len(arg2) == 0:
print 'arg2:None!'
else:
print 'arg2:',arg2
if len(arg3) == 0:
print 'arg3:None!'
else:
print 'arg3:',arg3
>>> f3(1)
arg1: 1
arg2:None!
arg3:None!
>>> f3(1,2)
arg1: 1
arg2: (2,)
arg3:None!
>>> f3(1,2,'s',x=1,y=2,z=3)
arg1: 1
arg2: (2, 's')
arg3: {'y': 2, 'x': 1, 'z': 3}
__________________
头疼加恶心看会代码分散注意力
哪个等腰三角形看人家写的答案就理解了,自己写就写不出来。。
这样下去是不是就完蛋了。。。