什么是函数?
编写代码的效率代码的重用具有独立功能的代码块组织为一个小模块定义函数
def 函数名():代码调用函数
直接用函数名()进行调用,需要在定义之后进行调用,位置也是写在定义后面练习: 定义一个函数,能够输出自己的姓名和年龄,并且调用这个函数让它执行
def print_mess(): name=input('请输入姓名:') age=input('请输入年龄:') tel_num=input('请输入手机号码:') print('姓名是:%s,年龄是:%s,手机号码是:%s'%(name,age,tel_num)) print_mess()形参:就是定义函数的时候,小括号里面的内容,用来接收实参而存在的
实参:就是调用函数的时候,小括号里面的内容
def sum_two_nums(a,b): result=a+b print(result) sum_two_nums(45,67)结果: 求三角形的周长:
def print_perimeter(a,b,c): per=a+b+c return per # print('这是三角形的周长') # 不会执行 per=print_perimeter(3,4,5) print(per)结果: 根据参数、返回值 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值
def A(): pass def A(): return def A(a): pass def A(a): return在调用的时候,缺了参数,但是缺的参数在定义函数的时候,就已经给这个参数赋值 了
在调用的时候,如果没有给出这个参数的值,那么使用定义函数中这个参数的 默认值,否则就会报错
在调用的时候,如果在调用的过程中也给出了这个参数的值,并且在定义时也赋 值了,那么使用调用函数中的值
def add(a,b,c,d=34): print(a) print(b) print(c) print(d) add(22,45,56,36)结果:
在调用函数的时候,参数个数不确定,那么需要在定义不定长参数函数的时候,用*表示可以接收参数个数为n个,*前面的参数是必须要传入的参数,确定传入参数个数,后面传入的都放到一个元组里面。
在不定长参数中*和**分别代表不同的含义
*代表的是元组**代表的是字典 def add_nums(a,b,c,*args): result=a+b+c print(args) for temp in args: result+=temp print('result=%d'%result) #方法一: # add_nums(1,2,3,23,45,78,89) #方法二: A=(23,45,78,89) add_nums(1,2,3,*A)结果: 元组和字典结合
def print_num(a,b,c,*args,**kwargs): result=a+b+c print(result) print(args) print(kwargs) #方法一: A=(34,56,'hello') B={'name':'xiaowang','age':34} print_num(2,3,4,*A,**B) #方法二: # print_num(2,3,4,34,56,345,'hello',name='xiaowang',age=34)结果:
一个函数里面调用了另一个函数,就是函数嵌套
打印图形 1、写一个函数打印一条横线
def print_one_line(): print('-'*30) print_one_line()结果: 2、打印自定义行数的横线(嵌套)
def print_one_line(): print('-'*30) def print_num_lines(a): i=0 while i<a: print_one_line() i+=1 print_num_lines(5)结果:(打印五条) 数学计算 1、写一个函数求三个数的和
def sum_three_num(a,b,c): result=a+b+c print(result) return result sum_three_num(1,2,3)结果: 6 2、写一个函数求三个数的平均值
def sum_three_num(a,b,c): result=a+b+c return result def avg_three_num(a1,b1,c1): sum1=sum_three_num(a1,b1,c1) avg=round(sum1/3,2) #保留俩位小数 print(avg) avg_three_num(1,1.3,1.2)结果:
局部变量
在函数内部定义的变量不同的函数可以定义相同的名字的局部变量为了临时保存数据,在函数中定义变量进行存储使用范围:
局部函数全局变量
如果一个变量,既能在一个函数中使用,也能在其他函数中使用,就是全局变量使用范围:
所有函数结果:(使用局部变量:a=10) 10
当函数中没有这个变量的时候,那么使用全局变量。 a=20 def A(): print(a) A()结果:(使用全局变量a=20) 20
当局部变量和全局变量名字一样的时候,如果想在函数中修改这个局部变量为全局变量,那么使用global
a=20 def A(): global a #将局部变量的值变为全局变量 a=10 print(a) # a=20 def B(): print(a) A() B()结果:
递归函数:自己调用自己 例子: 计算阶乘n! = 1 * 2 * 3…n
阶乘的计算 1!=1 2!=2*1=2*1! 3!=3*2*1=3*2! n!=n*(n-1) def num(a): if a>1: result=a*num(a-1) else: result=1 return result res=num(5) print(res)结果: 120
Lambda函数能接收任何数量的参数但只能返回一个表达式的值 匿名函数不能直接调用print,因为lanmbda需要一个表达式 匿名函数:
用lambda关键字创建一个函数,省略了用def定义函数的标准步骤用法:
lambda [arg1,arg2,argn]:expression res=lambda a,b:a+b print(res(3,5)) res=lambda a,b:a*b print(res(4,5))结果: 8 20
调用:
匿名函数返回的是一个表达式的值,所以需要用一个变量接收 匿名函数(参数)匿名函数的使用:
可以仅仅作为一个函数使用,可直接实现想要的功能还可以作为函数的参数使用,在调用的时候把lambda式子传递给函数的形参自己定义的函数
def fun(a,b,opt): print('a=%d'%a) print('b=%d'%b) print('result=%d'%opt(a,b)) fun(1,2,lambda x,y:x+y)结果: **还可以作为内置函数的参数:sort(key=lambda x:x[key]) 下面的数据如何指定按age或name排序?
students=[{'name':'laowang','age':23},{'name':'xiaoli','age':19}, {'name':'xiaozhao','age':34}] #按name排序 students.sort(key=lambda x:x['name']) print(students) #按年级降序排序 students.sort(key=lambda x:x['age'],reverse=True) print(students)结果: 函数的拼接:
def str_name(n1,n2,test): print(n1) print(n2) print(test(n1,n2)) str_name('zhang','xiaoming',lambda m,n:m+n)结果: 作为内置函数的参数,还可以从键盘输入,但是输入的这个lambda表达式只是一个字符串,所以需要用eval()转换成函数
def add_sum(a,b,fun): return fun(a,b) fun_new=input('请输入一个lambda表达式:') fun_new=eval(fun_new) print(type(fun_new)) res=add_sum(3,4,fun_new) print(res)结果:
名片管理系统v1.0 1、增加一个名片 2、删除一个名片 3、修改名片 4、查看某个名片 5、查看所有名片 6、退出系统
card_infos=[] def print_menu(): """显示功能模块""" print('*'*50) print('名片管理系统v1.0') print('1、增加一个名片') print('2、删除一个名片') print('3、修改名片') print('4、查看某个名片') print('5、查看所有名片') print('6、退出系统') print('*'*50) def add_new_card(): """完成增加名片的功能""" # 用来存储添加的名片信息 card_info={} name=input('请输入添加的姓名:') qq=input('请输入qq号:') weixin=input('请输入微信号:') addr=input('请输入地址:') card_info['name']=name card_info['qq']=qq card_info['weixin']=weixin card_info['addr']=addr # 把每一次添加的名片信息加入到list中 card_infos.append(card_info) # 测试的 # print(card_infos) def del_one_card(): """删除一个名片""" del_name=input('请输入删除的名片姓名:') flag=0 for temp in card_infos: if temp['name']==del_name: card_infos.remove(temp) flag=1 print('删除成功') if flag==0: print('用户不存在') def alt_one_card(): alt_name=input('请输入要修改的名片姓名:') flag=0 for temp in card_infos: if temp['name']==alt_name: i=card_infos.index(temp) new_name=input('请输入新的名片姓名:') new_qq=input('请输入新名片的qq号:') new_weixin=input('请输入新名片的微信:') new_addr=input('请输入新名片的地址:') card_infos[i]['name']=new_name card_infos[i]['qq']=new_qq card_infos[i]['weixin']=new_weixin card_infos[i]['addr']=new_addr flag=1 print('修改成功') if flag==0: print('您要修改的用户不存在') def find_one_card(): name=input('请输入要查找的姓名:') flag=0 # 用来表示有没有找到这个人,0代表没有这个人 for temp in card_infos: if temp['name']==name: print('姓名:%s\tqq号:%s\t微信:%s\t地址:%s'% (temp['name'],temp['qq'],temp['weixin'],temp['addr'])) flag=1 print('恭喜你,有这个人') if flag==0: print('查无此人') def find_all_card(): """查找所有名片信息""" print('姓名\tqq\t微信\t地址') for temp in card_infos: print('%s\t%s\t%s\t%s'%(temp['name'],temp['qq'],temp['weixin'],temp['addr'])) def main(): """控制整个程序的流程""" print_menu() while True: num = int(input('请输入序号:')) if num == 1: add_new_card() elif num == 2: del_one_card() elif num == 3: alt_one_card() elif num == 4: find_one_card() elif num == 5: find_all_card() elif num == 6: break main()结果:
2 用函数实现求100-200里面所有的素数
提示:素数的特征是除了1和其本身被整除,其他数都不能被整除的数 def prime(): for i in range(100,200): for j in range(2,i): if i % j ==0: break if i == j + 1: print(i) prime()结果: 101、103、107、109、113、127、131、137、139、149、151、157、163、167、173、179、181、191、193、197、199
3、请用函数实现一个判断用户输入的年份是否是闰年的程序 提示: 1、能被400整除的年份 2、能被4整除,但是不能被100整除的年份 以上2种方法满足一种即为闰年
def leap_year(a): if a%400==0 or (a%4==0 and a%100!=0): print('%d是闰年'%a) else: print('%d不是闰年'%a) leap_year(2004)结果:
1、用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也考虑进去 20180601 是今年第X天
time=input('请输入年月日:') def is_leap_year(year): if year%400==0 or (year%4==0 and year%100!=0): return 1 else: return 0 # 计算天数 def month_turn_day(year,month,day): day_sum=0 month31=[1,3,5,7,8,10,12] month30=[4,6,9,11] for x in range(1,month+1): if x in month31: day_sum+=31 elif x in month30: day_sum+=30 elif is_leap_year(year) and x==2: day_sum+=29 elif x==2: day_sum+=28 day_sum+=day print('%s是今年的第%d天'%(time,day_sum)) # 获取年月日 def get_y_m_d(time): year=int(time[0:4]) month=int(time[4:6]) day=int(time[6:8]) month_turn_day(year,month,day) get_y_m_d(time)结果: