函数:提高代码的复用性
函数即变量
1.函数的定义
定义函数使用def关键字,后面是函数名,函数名不能重复
1 def hello(): #hello是函数名 2 print(‘hello‘) #函数体 3 # 函数不调用不会被执行 4 hello() #调用函数
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.函数的返回值
return作用:1.返回数据(函数没有写返回值的时候,默认返回为None)
2.函数里面只要遇到return,函数立马执行结束
1 # 返回数据 2 def read_file(file_name): 3 with open(file_name, ‘r‘, encoding=‘utf-8‘) as f: 4 content = f.read() 5 return content #函数返回值,读完的结果返回 6 result = read_file(‘函数.txt‘) #保存返回值 7 print(‘result结果:‘, result) 8 9 # 函数里面只要遇到return,函数立马执行结束 10 def t(): 11 for i in range(5): 12 print(i) 13 return 14 t() 15 16 # 返回多个值 17 def func(): 18 a = 1 19 b = 2 20 c = 3 21 return a, b, c 22 result = func() #可以拿一个变量接收,返回的结果是元祖形式 23 print(result) 24 25 q, w, e = func() #有几个变量可以拿几个变量来接收(解包) 26 print(q, w, e) 27 28 29 # 解包:list有多个元素可以解开 30 info = [‘xiaohei‘, ‘beijing‘, ‘139‘] 31 name, addr, phone = info 32 print(name, addr, phone)
4.函数小练习
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 # 无参数 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.局部变量和全局变量
1 # 局部变量:定义在函数里面的变量(没有加global修饰),作用域在函数里面,出了函数就失效 2 # 全局变量:定义在函数外面的变量,一般都是写在代码的最上面,作用域是全部的,大家都可以用 3 4 name = ‘xiaohei‘ #全局变量 5 def rename(): 6 global name #global声明全局变量(在函数里面改全局变量) 7 name = ‘xiao‘ #局部变量 8 print(‘name1‘, name) 9 def test(): 10 print(‘name2‘, name) #函数里变量先在函数里找局部变量,取不到值,再去函数外找全局变量 11 print(‘name3‘, name) 12 rename() 13 print(‘name4‘, name) #调用函数后,声明的全局变量才生效 14 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定义匿名函数(冒号前面是入参,冒号后面是返回值)
原文:https://www.cnblogs.com/zhangxiaowai/p/12839757.html