函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义函数
-函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ();
-圆括号之间可以用于定义参数;
-函数体以冒号起始,并且缩进;
-return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
1 #计算面积函数 2 def area(width, height): 3 return width * height
参数传递
python中一切皆对象,函数中参数传递的是对象的引用。
(1)在函数中修改参数指向另一个对象时,实参的对象不会改变
(2)通过引用修改对象内容(对象必须是可变的)
1 # 参数传递 2 # (1)在函数中修改参数指向另一个对象时,实参的对象不会改变 3 def change1(name_in, list_in, dict_in): 4 name_in = "John" 5 list1_in = [1, 2, 3] 6 dict1_in = {'name':'John', 'age':21} 7 8 # (2)通过引用修改对象内容(当然这个对象必须是可变的) 9 def change2(list_in, dict_in): 10 list_in.append(4) 11 dict_in['age'] = 21 12 13 name_out = 'Simon' 14 list_out = [1, 1, 1] 15 dict_out = {'name':'Simon', 'age':18} 16 17 change1(name_out, list_out, dict_out) 18 print(name_out, list_out, dict_out) 19 20 change2(list_out, dict_out) 21 print(list_out, dict_out)
1 Simon [1, 1, 1] {'name': 'Simon', 'age': 18} 2 [1, 1, 1, 4] {'name': 'Simon', 'age': 21}
全局变量:
-全局变量所有作用域都可读
-对全局变量重新赋值需要关键字global
-特殊类型如list,dict在没有global的时候可以修改,但不可赋值
1 NAME_LIST = ['John', 'James'] 2 3 4 def func4(): 5 global NAME_LIST 6 NAME_LIST = ['Joshua', ] 7 print(NAME_LIST) 8 9 func4() 10 print(NAME_LIST) #NAME_LSIT被func4()修改 11 12 #程序输出 13 ['Joshua'] 14 ['Joshua']
1 NAME_LIST = ['John', 'James'] 2 3 4 def func4(): 5 # global NAME_LIST 6 NAME_LIST = ['Joshua', ] 7 print(NAME_LIST) 8 9 func4() 10 print(NAME_LIST) #函数外的NAME_LSIT仍然为 ['John', 'James'],没有被func4修改 11 12 #程序输出: 13 ['Joshua'] 14 ['John', 'James']
1 NAME_LIST = ['John', 'James'] 2 3 4 def func4(): 5 # global NAME_LIST 6 NAME_LIST.append('Joshua') 7 print(NAME_LIST) 8 9 func4() 10 print(NAME_LIST) #虽然没有global关键字,NAME_LIST却被func4修改 11 12 #程序输出: 13 ['John', 'James', 'Joshua'] 14 ['John', 'James', 'Joshua']
不定长参数(动态参数)
(1) def func(*args): print(args)
(2) def func(**kwargs): print(kwargs)
(3) def func(*args, **kwargs): print(args) print(kwargs)
1 # args是一个元组,存放不定长参数 2 def func1(*args): 3 print(args, type(args)) 4 5 6 # kwargs是一个字典,存放类似于name='John', age=18这样的不定长参数 7 def func2(**kwargs): 8 print(kwargs, type(kwargs)) 9 for key in kwargs.keys(): 10 print(key) 11 12 13 # 1,2的合并,万能参数 14 def func3(*args, **kwargs): 15 print(args) 16 print(kwargs) 17 18 func1(1, 2, 3) 19 list_args = [1, 2, 3] 20 func1(*list_args) # *将list里每一个元素当成参数传入函数 21 func1(list_args) # 将整个列表当作一个参数传入函数 22 23 dict_args = {"name":'John', 'age':18} 24 func2(**dict_args) # 将字典里每一个键值对当成参数传入函数 25 func2(k=dict_args) # 将整个字典当成一个参数传入函数 26 27 func3(*list_args, **dict_args)
1 (1, 2, 3) <class 'tuple'> 2 (1, 2, 3) <class 'tuple'> 3 ([1, 2, 3],) <class 'tuple'> 4 {'name': 'John', 'age': 18} <class 'dict'> 5 name 6 age 7 {'k': {'name': 'John', 'age': 18}} <class 'dict'> 8 k 9 (1, 2, 3) 10 {'name': 'John', 'age': 18}