函数定义和调用
def 函数名():
代码
函数参数
定义带有参数的函数
def add_num(a, b):
print(a+b)
add_num(11, 22)
- 注意:
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”。
- 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
默认参数
def print_info( name, age = 35 ):
print("Name: ", name)
print_info(name="Chen" )
- 注意:带有默认值的参数一定要位于参数列表的最后面(可设置多个带默认值的参数)
>>> def printinfo(name, age=35, sex):
... print name
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
不定长参数
- 加了星号(*)的变量args会存放所有未命名的变量参数,args为元组;而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典。
def fun(a,b,*args,**kwargs):
print('a=',a)
print('b=',b)
print('args=',args)
print('kwargs=',kwargs)
fun(1,2,3,4,name='Apple',name2='banana')
c=(3,4)
d={'name': 'Apple', 'name2': 'banana'}
fun(1,2,*c,**d)
fun(1,2,c,d)
函数返回值
- 在函数中把结果返回给调用者,需要在函数中使用return
def add_num(a, b):
return a+b
def print_num(a, b):
return a,b
num1,num2 = print_num(111,222)
局部变量
- 局部变量,就是在函数内部定义的变量
- 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
- 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
a = 100
def test1():
a = 200
print(f'test1中a={a}')
def test2():
print(f'test2中a={a}')
test1()
test2()
全局变量
- 如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
全局变量和局部变量名字相同问题
- 在函数外边定义的变量叫做全局变量
- 全局变量能够在所有的函数中进行访问
- 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
- 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇
a = 100
def test1():
a = 200
print(f'test1中a={a}')
def test2():
print(f'test2中a={a}')
test1()
test2()
修改全局变量
a = 100
def test1():
global a
print(f'test1修改前a={a}')
a = 200
print(f'test1修改后a={a}')
def test2():
print(f'test2中a={a}')
test1()
test2()
可变类型的全局变量
>>> a = 1
>>> def f():
... a += 1
... print(a)
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
>>>
>>>
>>> li = [1,]
>>> def f2():
... li.append(1)
... print(li)
...
>>> f2()
[1, 1]
>>> li
[1, 1]
- 注意:
- 在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
- 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
- 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量
|