文章目录
1 函数的基础知识
1.1 函数定义及调用
什么是函数?
- 编写代码的效率
- 代码的重用
- 具有独立功能的代码块组织为一个小模块
定义函数
- def 函数名():
- 代码
调用函数
- 直接用函数名()进行调用,需要在定义之后进行调用,位置也是写在定义后面
练习:
定义一个函数,能够输出自己的姓名和年龄,并且调用这个函数让它执行
def print_mess():
name=input('请输入姓名:')
age=input('请输入年龄:')
tel_num=input('请输入手机号码:')
print('姓名是:%s,年龄是:%s,手机号码是:%s'%(name,age,tel_num))
print_mess()
1.2 函数的参数
-
形参:就是定义函数的时候,小括号里面的内容,用来接收实参而存在的
-
实参:就是调用函数的时候,小括号里面的内容
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)
1.3 函数的返回值
- 返回值:就是函数返回给调用者的一个结果,需要用return
- return相当于循环中的break,在函数中遇到return那么就结束了,不管后面有多少代码,都不会执行
#如果要返回多个返回值,那么可以把多个返回值组织成列表、元组等,
#或者用逗号分隔开
def add(a,b):
return a
return b #这个return没实际意义,在return a,已经结束
res=add(34,67)
print(res)
结果:
根据参数、返回值
无参数,无返回值
无参数,有返回值
有参数,无返回值
有参数,有返回值
def A():
pass
def A():
return
def A(a):
pass
def A(a):
return
1.4 缺省参数
-
在调用的时候,缺了参数,但是缺的参数在定义函数的时候,就已经给这个参数赋值 了
-
在调用的时候,如果没有给出这个参数的值,那么使用定义函数中这个参数的
默认值,否则就会报错 -
在调用的时候,如果在调用的过程中也给出了这个参数的值,并且在定义时也赋
值了,那么使用调用函数中的值
def add(a,b,c,d=34):
print(a)
print(b)
print(c)
print(d)
add(22,45,56,36)
结果:
1.5不定长参数
在调用函数的时候,参数个数不确定,那么需要在定义不定长参数函数的时候,用*表示可以接收参数个数为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)
结果:
2 函数的嵌套调用
2.1函数怎样进行嵌套?
一个函数里面调用了另一个函数,就是函数嵌套
2.2 函数嵌套的应用
打印图形
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)
结果:
3 局部变量和全局变量
3.1 局部变量和全局变量的定义
局部变量
- 在函数内部定义的变量
- 不同的函数可以定义相同的名字的局部变量
- 为了临时保存数据,在函数中定义变量进行存储
使用范围:
- 局部函数
全局变量
- 如果一个变量,既能在一个函数中使用,也能在其他函数中使用,就是全局变量
使用范围:
- 所有函数
3.2 全局变量和局部变量的使用
- 当函数中有自己的变量的时候,那么使用自己的局部变量。
a=20
def A():
a=10
print(a)
A()
结果:(使用局部变量:a=10)
10
- 当函数中没有这个变量的时候,那么使用全局变量。
a=20
def A():
print(a)
A()
结果:(使用全局变量a=20)
20
3.3 修改全局变量
当局部变量和全局变量名字一样的时候,如果想在函数中修改这个局部变量为全局变量,那么使用global
a=20
def A():
global a #将局部变量的值变为全局变量
a=10
print(a)
# a=20
def B():
print(a)
A()
B()
结果:
4 递归函数和匿名函数
4.1 递归函数
递归函数:自己调用自己
例子:
计算阶乘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
4.2 匿名函数
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)
结果:
5 练习
5.1 创建名片管理系统
名片管理系统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)
结果:
5.2 判断第几天
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)
结果: