python学习笔记05:函数
1. 定义函数
作用:
- 在开发程序时,使用函数可以提高 编写的效率以及 代码的复用性。
使用:
- 定义函数:def 函数名():
- 函数名不能重复,可以右字符下划线和数字组成,不能以数字开头,不可以与关键字重名。
- 调用函数:函数名()
# 函数格式: def 函数名(): 函数封装的代码 函数名()
参考:
def hello(): # hello是函数名 print('hello') # 函数体 hello() # 调用函数,函数不调用不会执行
注意:
- 1、函数即变量
- 2、函数添加注释(使用三引号注释),在函数调用位置,使用快捷键ctrl+q可以查看函数的说明信息;
- 2、函数体相对比较独立,函数定义及调用函数的上方 保留2个空行,否则会有波浪线;


2. 函数的参数
作用:
- 增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据。
- 在函数 内部,把参数当作 变量 使用,进行需要的数据处理。
- 函数调用时,按照函数定义的 参数顺序,把希望在函数内部处理的数据,通过参数 传递。
使用:
- 多个参数之间使用 , 号分隔 参数分为形参和实参
- 形参:定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用。
- 实参:调用 函数时,小括号中的参数,是用来 把数据传递到函数内部 用的。
1 # 写文件 2 def write_file(file_name,content): #file_name和content是形参 3 with open(file_name, 'w', encoding='utf_8') as f: 4 f.write(content) 5 write_file('函数.txt','学习函数') #'函数.txt'和'学习函数'是实参
3. 函数的返回值
作用:
- 1.返回结果(函数没有写返回值的时候,默认返回为None)
- 2.函数里面只要遇到return,函数立马 执行结束,下方代码不会被执行到。
使用:
- 可以使用 变量 来 接收 函数的 返回结果
1)返回数据
# 返回数据 def read_file(file_name): with open(file_name, 'r', encoding='utf-8') as f: content = f.read() return content # 函数返回值,读完的结果返回 result = read_file('函数.txt') # 使用变量保存返回值 print('result结果:', result)
2)遇到return立马返回
# 函数里面只要遇到return,函数立马执行结束 def t(): for i in range(5): print(i) return t()
3)多个返回值
# 多个返回值 def measure(): temp = 39 wetness = 50 return temp, wetness # return (temp, wetness)如果函数返回的类型是元组,小括号可以省略 result = measure() #可以拿一个变量接收,返回的结果是元祖形式 print(result) # 使用多个变量,一次性接收函数的返回结果 # 注意:使用多个变量接收结果时,变量的个数 应该和 元组中元素的个数 保持一致 gl_temp, gl_wetness = measure() # 接收多个变量(称为“解包”) print(gl_temp, gl_wetness)
解包
# 解包:list有多个元素可以解开 info = ['xiaohei', 'beijing', '139'] name, addr, phone = info print(name, addr, phone)
4. 函数的嵌套调用
在工作中针对需求的变化,不要轻易修改之前已经完成的代码。
# 一个函数能够打印5行分割线,由任意字符 任意次数组成的分隔线 def print_line(char, times): """打印单行分割线 :param char: 分割线使用的分隔字符 :param times: 分隔线重复的次数 """ print(char * times) def print_lines(char,times,num): """打印多行分割线 :param char:分割线使用的分隔符 :param times:分割线重复的次数 :param num:打印行数 """ for i in range(num): print_line(char, times) print_lines("-", 20, 6)
小技巧:函数添加文档注释


函数小练习
1 # 判断s是否是合法小数,如s = '14.1',返回True或False 2 # 分析: 3 # 1)传参 4 # 2)把入参转成字符串 5 # 3)判断小数点个数是否为1 6 # 4)判断小数点前面是否为整数 7 # 5)判断小数点后面是否为整数 8 9 def is_float(s): 10 s = str(s) 11 if s.count('.') == 1: #判断小数点是否存在 12 left, right = s.split('.') #分割小数点的左右 13 if right.isdigit() and left.isdigit(): #判断是否是正小数(左右两边是否是整数) 14 if int(right) != 0 or int(left) != 0: #判断左右两边不能同时为0(因0.0不是小数) 15 return True 16 17 if left.startswith('-') and left.count('-') == 1: #判断是否是负小数 18 num = left[1:] 19 if num.isdigit() and right.isdigit(): 20 if int(right) != 0 or int(left) != 0: 21 return True 22 return False 23 print(is_float('-1.3'))
5. 函数的形参
1)缺省参数
- 定义函数时,可以给 某个参数 指定一个 默认值,具有默认值的参数就叫做 缺省参数。
- 调用函数时,如果 没有传入缺省参数 的值,则在函数内部使用定义函数时指定的参数默认值。
- 函数的缺省参数,将常见的值设为参数的缺省值,从而简化函数的调用。
1 # 无参数 2 def a(): 3 pass 4 5 # 必填参数 6 def b(name,age): #又叫位置参数 7 pass 8 b('xiaohei',19) 9 10 # 默认值参数 11 def op_file(file, content=None): #默认值参数 12 with open(file, 'a+', encoding='utf-8') as f: 13 if content: #传值,说明要写 14 f.write(str(content)) 15 else: #没传值,说明要读 16 f.seek(0) 17 result = f.read() 18 return result 19 20 # 可变参数 21 # 1.这个参数非必传 22 # 2.不限制参数的个数 23 # 3.args是元祖 24 def send_sms(*args): #可变参数 25 print(args) 26 print(type(args)) 27 send_sms(151,150,138,131) 28 29 # 关键字参数 30 # 1.这个参数非必传 31 # 2.不限制参数的个数 32 # 3.kwargs是字典 33 def t(**kwargs): #关键字参数 34 print(kwargs) 35 print(type(kwargs)) 36 t(age = 5, name = 'beijing') #关键字参数,传入的必须指定关键字 37 38 # 如果四种参数一起用的话,顺序必须是: 必填参数、默认值参数, 可变参数、关键值参数 39 def test(name,content=None,*args,**kwargs): 40 print(name) 41 print(content) 42 print(args) 43 print(kwargs) 44 45 46 def test(name, phone, age, addr, sex): 47 print(name) 48 print(phone) 49 print(age) 50 print(addr) 51 print(sex) 52 test('小明','1111','18','北京','男') #根据定义的参数顺序来传参,容易传错顺序 53 test(age='18', name='小明', phone='1111', addr='北京', sex='男') #指定关键字传参,不需要按照顺序 54 test('小明', '1111', age='18', addr='北京', sex='男') #组合传参 55 # test('小明', '1111', age='18', addr='北京', '男') #错误的,不能这样写
6. 局部变量和全局变量
在python中,在函数内部是不允许直接修改全局变量的值。如果在函数中修改全局变量,需要使用global进行声明。
- 全局变量:定义在 函数外面 的变量,位置应该定义在 函数的上面,作用域是 全部的,大家都可以用。
- 局部变量:定义在 函数里面 的变量(没有加global修饰),作用域在 函数里面,出了函数就失效。
建议:
为了避免局部变量和全局变量混淆,在定义全局变量时,变量名前面增加 g_ 或者 gl_ 的前缀。
name = 'xiaohei' # 全局变量 def rename(): global name # global声明全局变量(在函数里面改全局变量) name = 'xiao' # 局部变量 print('name1', name) def test(): print('name2', name) # 函数里变量先在函数里找局部变量,取不到值,再去函数外找全局变量 print('name3', name) rename() print('name4', name) # 调用函数后,声明的全局变量才生效 test()
小练习:
1 money = 500 2 def test(consume): # 3.test(500) 3 return money - consume #4.500全局变量-500consume=0 4 def test1(money): # 2.test1(500) 5 return test(money) +money # 5.test(500)+全局变量500 6 money = test1(money) # 1.test1(500全局变量) 7 print(money) #打印500 8 9 10 11 def test(): 12 global a 13 a = 5 14 def test1(): 15 c = a+5 16 return c 17 test() # 定义函数,不调用不会执行 18 res = test1() 19 print(res)
7. 递归函数
1 # 递归函数:函数自己调用自己,有最大的递归次数999 2 def xiake(): 3 print('下课') 4 xiake() #调用函数 5 xiake() #调用函数 6 7 8 # 递归效率没有循环效率高 9 def enter(): 10 choice = input('请输入你的选择(1、登录;2、注册;3、后台管理):') 11 if choice not in ['1', '2', '3']: 12 print('输入有误,请重新输入') 13 enter() 14 else: 15 print('登录') 16 enter()
8. 内置函数
1 int() #转整数 2 str() #转字符串 3 list() #转列表类型 4 set() #转集合类型 5 dict() #转字典类型 6 tuple() #转元祖类型 7 bool() #转bool类型 8 type() #查看类型 9 len() #取长度 10 input() #输出 11 print() #打印 12 13 print(all([1, 2, 3, 0])) #判断可循环的对象里面的值是否都为真,返回True,否则返回False(非空即真,非0即真) 14 print(any([1, 2, 3, 0])) #判断可循环的对象里面的值是否有一个为真,返回True,否则返回False(非空即真,非0即真) 15 print(bin(10)) #十进制转二进制 16 print(chr(33)) #数字对应的ASCII 17 print(ord('b')) #字符串对应的ASCII 18 print(hex(111)) #数字转成16进制 19 print(oct(111)) #数字转成8进制 20 21 print(max(111, 12)) #取最大值 22 print(sum([111, 12])) #求和 23 print(divmod(10, 3)) #取余数,打印(商,余数) 24 print(round(11.11111, 2)) #取几位小数 25 26 f = open('a.txt', 'w') 27 print(dir('f')) #dir()打印传入对象的可调用方法 28 29 def func(): 30 name = 'abc' 31 age = 18 32 print(locals()) #locals()返回函数里局部变量放到字典l里 33 func() 34 # 返回结果:{'name': 'abc', 'age': 18} 35 36 name = '124' 37 print(globals()) #返回程序内所有变量,返回的是一个字典 38 39 # zip:把2个list合成一个二维数组 40 l = ['u1', 'u2', 'u4'] 41 l2 = ['p1', 'p2', 'p3', 'p4'] 42 print(list(zip(l, l2))) 43 # 返回结果:[('u1', 'p1'), ('u2', 'p2'), ('u4', 'p3')] 44 45 # sorted:排序(不影响原来的值) 46 l = [1, 4, 2, 6, 45, 56, 32] 47 print(sorted(l)) #升序 48 print(sorted(l, reverse=True)) #降序 49 50 # sorted二维数组排序 51 l3 = [['小黑', 45], ['小贝', 20], ['小白', 35]] 52 # 方法一: 53 l4 = sorted(l3, reverse=True, key=lambda x: x[-1]) #key的作用:传函数名 54 print(l4) 55 # 方法二: 56 def use_key(x): 57 return x[1] 58 l5 = sorted(l3, reverse=True,key=use_key) #根据某个值排序 59 print(l5) 60 61 # 三维数组排序 62 l7 = [['小黑', 45, ['xx', 13]], ['小贝', 20, ['xx', 11]], ['小白', 35, ['xx', 33]]] 63 l7 = sorted(l7, reverse=True, key=lambda x: x[-1][-1]) 64 print(l7) 65 66 # sorted字典排序 67 d = {'a': 3, 'c': 1, 'b': 2} 68 l5 = sorted(d.items(), reverse=True, key=lambda x:x[0]) #按key排序 69 l6 = sorted(d.items(), reverse=True, key=lambda x:x[-1]) #按value排序 70 print(l5) 71 print(l6) 72 73 # filter:循环对象,过滤参数 74 # 方法一: 75 def filter_test(x): 76 return x > 5 77 result = filter(filter_test, [12, 3, 2, 1, 35]) #循环list里的值传给函数 78 print(list(result)) 79 # 返回结果:[12, 35] 80 # 方法二: 81 result2 = filter(lambda x: x > 5, [12, 3, 2, 35]) #循环把list里的值传给函数 82 print(list(result2)) 83 # 返回结果:[12, 35] 84 85 # map:循环对象,保存函数的返回值 86 result4 = map(lambda x: str(x).strip().zfill(3), [2, 3, 4]) 87 print(list(result4)) 88 # 返回结果:['002', '003', '004'] 89 90 # enumerate:循环对象,自动计算下标,生成二维数组 91 l = ['注册', '登录', '购物', '积分查询'] 92 for index, i in enumerate(l, 1): #不传值是默认下标从0开始 93 print('%s->%s' % (index, i)) 94 print('请输入你的选择:') 95 # 返回结果: 96 # 1->注册 97 # 2->登录 98 # 3->购物 99 # 4->积分查询 100 101 # exec:执行python代码 102 str_code = ''' 103 l = [12, 3, 2, 35] 104 print([str(i).strip().zfill(3) for i in l ]) 105 ''' 106 exec(str_code) 107 # 返回结果:['012', '003', '002', '035'] 108 109 # eval:执行python代码,只能执行简单的,定义数据类型和运算 110 result = eval('{"code":1,"name":"小黑"}') 111 print(result) #返回结果:{'code': 1, 'name': '小黑'}
9. 匿名函数
# 匿名函数:是一个简单的函数,没有名字,只能实现一些简单的功能
# lambda x,y:x+y
# lambdad定义匿名函数(冒号前面是入参,冒号后面是返回值)

浙公网安备 33010602011771号