函数的好处:提高代码复用性,简化代码,代码可扩展。
函数只有调用的时候才会被执行。
1.参数:
形参&实参;
位置参数,属于必填参数;
默认值参数,为非必填参数,没有传值时使用默认值;
关键字参数;
可变参数;
不定长参数;
例1:
1 # file_name,content 为位置参数,属于必填参数,content1是默认值参数,没有传入值为使用默认值,非必填参数 2 def write_file(file_name,content,content1 = 'test'): # 形参,形式参数, 3 f = open(file_name,'a+',encoding='utf-8') 4 f.seek(0) 5 f.write(content + '---' +content1 + ' ') 6 f.close() 7 write_file('file0.txt','hello world') #向文件'file.txt' 写入 content 为'hello world',以及content1的默认值 'test' 8 #write_file('file0.txt') # 只传一个会报错,content1是默认值参数可以不传值 9 write_file('file0.txt','aaa','see you') #实参,实际参数,写入'aaa' 以及'see you' 10 write_file(file_name='file0.txt',content ='good') # 关键字参数
结果如下:
例2: *args 的使用
def test1(a,b=1,*args): # *args 可变参数, 不一定写*args, 也可以别的,可随意写,但是一般都是写*args print(a,b,args) #print(args[0]) # 元祖第一个值,如果函数调用的时候没有传入*args的值,这句话会报错 test1('ttti') #ttti 1 () # 位置调用,第一个给a, 第二个给b, 后面的都是*args test1('nancy',2,'123','456','789') # args 是个元祖 -> args ('123', '456', '789') #nancy 2 ('123', '456', '789') #关键字调用,可变参数不能和关键字一起调用,如果可变参数要传值的话要按顺序来传 test1(b=5,a=10)#10 5 () t =(1,2,3,4) test1(*t) #1 2 (3, 4) y = [6,7,8] test1(*y) #6 7 (8,) r = {'aa':'09','bb':'89','cc':'78'} test1(*r) #打印的是字典的key,因为字典也无序,所有打印的值会变 #cc aa ('bb',)
例3:**kwargs的使用
def test2(**kwargs): print(kwargs) test2() # -> {} 空字典 test2(name = 'hhh',sex = '18') # -> {'name': 'hhh', 'sex': '18'}
2. 返回值
如果想获取到函数处理的结果,那么必须return,
如果函数没有写retun的话,返回结果是None,
函数里遇到return,函数立即结束。
1 def test_1(file_name,content = 'ttt'): 2 f = open(file_name,'a+',encoding='utf-8') 3 #return 4 if content: 5 f.write(content + ' ') 6 res = '' 7 else: 8 f.seek(0) 9 res = f.read() 10 #return res # 写在这的话,如果走else 时,遇到return 函数立即结果,那么文件不会被关闭,因此要放在f.close() 下面 11 f.close() 12 return res 13 #print(res) #函数里的变量外面不能引用 14 text = test_1('file3.txt') 15 print(text)
3. 局部变量和全局变量
全局变量的作用域是整个程序,在程序最前面定义,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。
1 a = 100 #全局变量 2 def test(): 3 #global a #如果想要修改全局变量的值,必须要声明一下 4 print(a) 5 a = 5 # 局部变量 6 print(a) 7 test() # 函数要调用才能使用
这种情况直接print(a) 会报错,UnboundLocalError: local variable 'a' referenced before assignment
变量在使用前必须要先声明。
如果第4行想打印全局变量a =100的值的话,可以使用第3行,记住,使用前先声明。
这样输入的结果为100 和5,第一个输出的是全局变量100,第二个是局部变量5。
4. 递归:自己调用自己
1 def test1(): 2 num = int(input('please enter a number:')) 3 if num % 2 ==0: #判断输入的数字是不是偶数 4 return True 5 print('不是偶数请重新输入') 6 return test1() # 如果不是偶数的话继续调用自己,输入值 7 print(test1()) #调用test1()