本章内容:
>函数是将一段实现功能的完整代码,使用函数名称进行封装,通过函数名称进行调用
>函数定义的语法结构
• def 函数名称(参数列表):
函数体
[return 返回值列表]
> 函数的调用:
- 不带返回值的函数直接调用
- 带返回值的函数调用之后要将结果保存到变量中
> 函数参数的类型:
- 函数定义处的参数称为形式参数,形式参数可以定成:
位置参数
默认值参数
可变参数
- 函数调用处的参数称为实际参数,在进行参数传递时可以仍关键字参数传参或位置参数传参
> 按照变量的作用域可分:局部变量和全局变量
- 只有一句函数体的函数可以使用匿名函数(lambda)替代
- 递归的组成部分:递归调用与递归终止条件,可以使用i-..else结构实现
- 常用的内置函数可分为:数据类型转换函数、数学函数、迭代器操作函数和其它函数
本章示例:
示例8-1函数的定义及调用
def get_sum(num):
s=0
for i in range(1,num+1):
s+=i
print(f'1到{num}之间的累加和为:{s}')
get_sum(10)
get_sum(100)
get_sum(1000)
示例8-2位置参数的使用
def happy_birthday(name,age):
print('祝'+name+'生日快乐')
print(str(age)+'岁生日快乐')
#happy_birthday('娟子姐') # TypeError: happy_birthday() missing 1 required positional argument: 'age'
#happy_birthday(18,'娟子姐') # TypeError: can only concatenate str (not "int") to str
happy_birthday('娟子姐',18)
示例8-3关键字传参的使用
def happy_birthday(name, age):
print('祝' + name + '生日快乐')
print(str(age) + '岁生日快乐')
happy_birthday(age=18, name='娟子姐')
# happy_birthday(age=18,name1='娟子姐') #TypeError: happy_birthday() got an unexpected keyword argument 'name1'
happy_birthday('陈梅梅', age=18)
#happy_birthday(name='陈梅梅',18) # SyntaxError: positional argument follows keyword argument
#位置传参在前,关键字传参在后
示例8-4默认值参数的使用
def happy_birthday(name='娟子姐', age=18):
print('祝' + name + '生日快乐')
print(str(age) + '岁生日快乐')
happy_birthday()
happy_birthday('陈梅梅')
happy_birthday(age=19)
# happy_birthday(19) #19会被赋值给变更name
def fun(a,b=20):
pass
# def fun(a=20,b): #SyntaxError: parameter without a default follows parameter with a default
# pass
#当位置参数和关键字参数同时存在时,应遵循 位置参数在前,默认值参数在后的原则
示例8-5可变参数的使用
def fun(*para):
print(type(para))
for item in para:
print(item)
fun(10,20,30,40)
fun(10)
fun(20,30)
fun([11,22,33,44])
#调用时,参数前加一颗星,将列表进行解包
fun(*[11,22,33,44])
def fun2(**kwpara):
print(type(kwpara))
for key,value in kwpara.items():
print(key,'-------',value)
fun2(name='娟子姐',age=18,height=170)
d={'name':'娟子姐','age':18,'height':170}
# fun2(d) # TypeError: fun2() takes 0 positional arguments but 1 was given
fun2(**d)
示例8-6函数返回值的使用
def calc(a,b):
print(a+b)
calc(10,20)
print(calc(1,2))
def calc2(a,b):
s=a+b
return s
print('-'*10)
get_s=calc2(1,2)
print(get_s)
get_s2=calc2(calc2(1,2),3)
print(get_s2)
def get_sum(num):
s=0
odd_sum=0
even_sum=0
for i in range(1,num+1):
if i%2!=0:
odd_sum+=i
else:
even_sum+=i
s+=i
return odd_sum,even_sum,s
result=get_sum(10)
print(type(result))
print(result)
a,b,c=get_sum(10)
print(a)
print(b)
print(c)
示例8-7局部变量的作用域
def calc(a,b):
s=a+b
return s
result=calc(10,20)
print(result)
# print(a,b,s)
示例8-8全局变量的使用
a=100
def calc(x,y):
return a+x+y
print(a)
print(calc(10,20))
print('-'*30)
def calc2(x,y):
a=200
return a+x+y
print(calc2(10,20))
print(a)
print('-'*30)
def calc3(x,y):
global s
s=300
return s+x+y
print(calc3(10,20))
print(s)
示例8-9匿名函数的使用
def calc(a, b):
return a + b
print(calc(10, 20))
# 匿名函数
s = lambda a, b: a + b
print(type(s))
print(s(10, 20))
print('-'*30)
lst = [10, 20, 30, 40, 50]
for i in range(len(lst)):
print(lst[i])
print('-'*30)
for i in range(len(lst)):
result=lambda x:x[i]
print(result(lst))
student_score=[
{'name':'陈梅梅','score':98},
{'name':'王一一','score':95},
{'name':'张天乐','score':100},
{'name':'白雪儿','score':65}
]
student_score.sort(key=lambda x:x.get('score'),reverse=True)
print(student_score)
示例8-10使用递归计算N的阶乘
def fac(n):
if n==1:
return 1
else:
return n*fac(n-1)
print(fac(5))
示例8-11斐波那契数列
def fac(n):
if n==1 or n==2:
return 1
else:
return fac(n-1)+fac(n-2)
print(fac(9))
for i in range(1,10):
print(fac(i),end='\t')
print()
示例8-12数据类型转换函数的使用
print('非空字符串的布尔值:',bool('hello'))
print('空字符串的布尔值:',bool(''))
print('空列表的布尔值:',bool([]))
print('空列表的布尔值',bool(list()))
print('空元组的布尔值:',bool(()))
print('空元组的布尔值:',bool(tuple()))
print('空集合的布尔值:',bool(set()))
print('空字典的布尔值:',bool({}))
print('空字典的布尔值:',bool(dict()))
print('-'*30)
print('非0数值的布尔值:',bool(123))
print('整数0的布尔值:',bool(0))
print('浮点数0的布布尔值:',bool(0.0))
lst=[10,20,30]
print(type(lst),lst)
s=str(lst)
print(type(s),s)
print('-'*30,'float类型和str类型转换为int类型','-'*30)
print(int(98.7)+int('90'))
#注意事项
# print(int('98.7')) # ValueError: invalid literal for int() with base 10: '98.7'
print('-'*30,'int,str类型转换为float类型','-'*30)
print(float(90)+float('3.14'))
s='hello'
print(list(s))
seq=range(1,10)
print(tuple(seq))
print(set(seq))
print(list(seq))
示例8-13数学函数的使用
print('绝对值', abs(100), abs(-100), abs(0))
print('商和余数:', divmod(13, 4))
print('最大值:', max('hello'))
print('最大值:', max([10, 4, 56, 78, 4]))
print('最小值:', min('hello'))
print('最大值:', min([10, 4, 56, 78, 4]))
print('求和:', sum([10,34,45]))
print('x的y次幂:',pow(2,3))
print(round(3.1415926))
print(round(3.9415926))
print(round(3.1415926,2))
print(round(314.15926,-1))
print(round(314.15926,-2))
示例8-14迭代器操作函数的使用
lst=[54,56,77,4,567,34]
asc_lst=sorted(lst)
desc_lst=sorted(lst,reverse=True)
print('原列表:',lst)
print('升序:',asc_lst)
print('降序:',desc_lst)
new_lst=reversed(lst)
print(type(new_lst))
print(list(new_lst))
x=['a','b','c','d']
y=[10,20,30,40,50]
zipobj=zip(x,y)
print(type(zipobj))
# print(list(zipobj))
enum=enumerate(y,start=1)
print(type(enum))
print(tuple(enum))
lst2=[10,20,'',30]
print(all(lst2))
print(all(lst))
print(any(lst2))
print(next(zipobj))
print(next(zipobj))
print(next(zipobj))
def fun(num):
return num%2==1
obj=filter(fun,range(10))
print(list(obj))
def upper(x):
return x.upper()
new_lst2=['hello','world','python']
obj2=map(upper,new_lst2)
print(list(obj2))
示例8-15其它函数的使用
print(format(3.14,'20'))
print(format('hello','20'))
print(format('hello','*<20'))
print(format('hello','*>20'))
print(format('hello','*^20'))
print(format(3.1415926,'.2f'))
print(format(20,'b'))
print(format(20,'o'))
print(format(20,'x'))
print(format(20,'X'))
print('-'*40)
print(len('helloworld'))
print(len([10,20,30,40,50]))
print('-'*40)
print(id(10))
print(id('helloworld'))
print(type('hello'),type(10))
print(eval('10+30'))
print(eval('10>30'))
注:本文中的所有内容及示例均引自@Python_子木的视频