函数的定义和调用
1、内置函数:
输出函数print()
输入函数input()
列表定义的函数list()
2、自定义函数
def 函数名称(参数列表):
函数体
[return返回值列表]
3、函数调用
函数名(参数列表)
不带返回值的函数直接调用,带返回值的函数调用后要将结果保存到变量中
点击查看代码
示例8-1函数定义及调用
def get_num(num):#num叫做形式参数
s=0
for i in range(1,num+1):
s+=i
print(f'1到{num}的累加和为:',s)
#函数的调用
get_num(10)#1-10之间的累加和 ,10为实际参数
get_num(100)#1-100之间的累加和,100为实际参数
get_num(1000)#1-1000之间的累加和,1000为实际参数
函数的参数传递
1、位置参数
调用时的参数个数和顺序必须与定义的参数个数和顺序相同
2、关键词参数
函数调用时,使用"形参名称=值“的方式进行传参,传递参数的顺序可以和定义时的不同
3、默认值参数
在函数定义时,直接对形式参数进行赋值,在调用时如果该参数不传值,将使用默认值,如果该参数传值,则使用传递的值
点击查看代码
示例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='娟子姐')#定义形参为name。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)#关键字传参,name采用默认值
#happy_birthday(19)#19会赋值给那个变量,如果采用位置传参19被传给了name。TypeError: can only concatenate str (not "int") to str
def fun(a,b=20):#a作为位置参数,b为默认参数
pass
#def fun(a=20,b):#报错了,语法错误,当位置参数与默认值参数同时存在时,位置参数在后会报错
#pass
#当位置参数与关键字参数同时存在时,位置参数在前,默认参数在后
4、可变参数
点击查看代码
示例8-5可变参数的使用
#个数可变的位置参数
def fun(*para):
print(type(para))
for item in para:
print(item)
#调用
fun(10,20,30,40)
fun(10)
fun(30,40)
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(10,20))#None
def calc2(a,b):
s=a+b
return s #将s返回给函数的调用处去处理
print('-'*20)
get_s=calc2(1,2) #存储到变量中
print(get_s)
get_s=calc2(calc2(1,2),3)#1+2+3 先去执行calc2(1,2)返回结果为3,再去执行clac2(3,3)
print(get_s)
#返回值可以是多个
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) #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 #a是全局变量还是局部变量? 局部变量,当全局变量和局部变量的名称相同时,谁的优先级高呢? 局部变量
print(calc2(10,20))
print(a)
print('-'*30)
def calc3(x,y):
global s #s在函数中定义的变量,但是使用了global,这个变量s变成了全局变量
s=300 #声明和赋值必须分开执行、
return s+x+y
print(calc3(10,20))
print(s)
匿名函数的使用
result=lambda 参数列表:表达式
点击查看代码
示例8-9匿名函数的使用
def calc(a,b):
return a+b
print(calc(10,20))
#匿名函数
s=lambda a,b:a+b #s表示就是一个匿名函数
print(type(s))
#调用匿名函数
print(s(10,20))
print('-'*20)
#列表的取值操作
lst=[10,20,30,40,50]
for i in range(0,len(lst)):
print(lst[i])
print()
print('-'*20)
for i in range(len(lst)):
result=lambda x:x[i] #根据索引取值,result的类型为function,x是形式参数
print(result(lst))#lst是实际参数
print('-'*20)
#
student_scores=[
{'name':'陈苗苗','score':98},
{'name':'王一一','score':95},
{'name':'张天乐','score':100},
{'name':'白雪儿','score':65},
]
#对列表中的元素进行排序,排序规则是字典中的成绩
student_scores.sort(key=lambda x:x.get('score'),reverse=True)
print(student_scores)
print('-'*20)
递归函数
点击查看代码
示例8-10递归函数计算n!
def fac(n): #n的阶乘 N!=N*(N-1)!......1!=1
if n==1:
return 1
else:
return n*fac(n-1) #自己调用自己
print(fac(5))#5!=5*4*3*2*1=120
斐波那契数列
点击查看代码
示例8-11斐波那契数列
def fac(n):
if n==1 or n==2:
return 1
else:
return fac(n-1)+fac(n-2)
print(fac(9))#第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('-'*20)
print('非0的布尔值:',bool(123))
print('整数0的布尔值:',bool(0))
print('浮点数0.0的布尔值:',bool(0.0))
print('-'*20)
#将其他类型转化为字符串类型
lst=[10,20,30]
print(type(lst),lst)
s=str(lst)
print(type(s),s)
#float类型转为int类型
print('-'*30,'float类型转为int类型:','-'*30)
print(int(98.7)+int('90'))
#注意事项
#print(int('98.7'))#ValueError: invalid literal for int() with base 10: '98.7'
#print(int('a'))#ValueError: invalid literal for int() with base 10: 'a'
print('-'*30,'int类型转为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))#round 只有一个参数,保留整数
print(round(3.9))
print(round(3.1415926,2))#2表示保留两位小数
print(round(314.15926,-1))#314,-1位对个位进行四舍五入
print(round(314.15926,-2))#314,-2位对十位进行四舍五入
点击查看代码
示例8-14迭代器操作函数的使用
lst=[54,56,77,4,567,34]
#(1)排序
asc_lst=sorted(lst)#升序
desc_lst=sorted(lst,reverse=True)#降序
print('原列表',lst)
print('升序:',asc_lst)
print('降序:',desc_lst)
#(2)reverse 反向
new_lst=reversed(lst)
print(type(new_lst))#<class 'list_reverseiterator'>
print(list(new_lst))
#(3)zip
x=['a','b','c']
y=[10,20,30]
zipobj=zip(x,y)
print(type(zipobj))#<class 'zip'>
#print(list(zipobj))
#(4)enumerste
enum=enumerate(y,start=1)
print(type(enum))#<class 'enumerate'>
print(tuple(enum))
#(5)all()
lst2=[10,20,'',30]
print(all(lst2))#False,空字符串的布尔值为False
print(all(lst))#True
#(6)any
print(any(lst2))#True
#(7)next
print(next(zipobj))#('a', 10)
print(next(zipobj))#('b', 20)
print(next(zipobj))#('c', 30)
#(8)filter
def fun(num):
return num%2==1 #可能为True或False
obj=filter(fun,range(10)) #将range(10),0-9的整数,都执行一次fun操作
print(list(obj)) #[1,3,5,7,9]
#(9)map
def upper(x):
return x.upper()
new_lst2=['hello','world','Pathon']
obj2=map(upper,new_lst2)
print(list(obj2))
点击查看代码
示例8-15其他函数的使用
#format()
print(format(3.14,'20'))#数值型默认右对齐
print(format('hello','20'))#字符串型默认左对齐
print(format('hello','*<20'))#<左对齐,*表示的是填充符,20表示的是显示的宽度
print(format('hello','*>20'))
print(format('hello','*^20'))
print(format(3.1415926,'.2f'))#3.14
print(format(20,'b'))
print(format(20,'o'))
print(format(20,'x'))
print(format(20,'X'))
print('-'*40)
print(len('helloworld'))
print([10,20,30,40,50])
print('-'*40)
print(id(10))
print(id('helloworld'))
print(type('hellow'),type(10))
print('-'*40)
print(eval('10+30'))
print(eval('10>30'))
点击查看代码
#我的思路
#随机产生10个元素存储到列表
import random
lst=[]
for i in range(10):
rand=random.randint(1,100)
lst.append(rand)
print(lst)
#获取列表中元素的最大值
def lst_name(n):
n.sort(reverse=True)
return n[0]
print(lst_name(lst))
#老师的思路
import random
def get_max(lst):
x=lst[0]#x存储的最大值
#遍历
for i in range(1,len(lst)):
if lst[i]>x:
x=lst[i]
return x
#调用
lst=[random.randint(1,100) for i in range(10)]
print(lst)
#计算列表元素的最大值
max=get_max(lst)
print(max)
点击查看代码
实战二
#我的思路
str=input('请输入一个字符串:')
lst=[]
for i in range(0,len(str)):
if str[i].isdigit():
lst.append(str[i])
for j in range(0,len(lst)):
lst[j]=int(lst[j])
print(lst)
def num(lst):
sum=0
for i in range(0,len(lst)):
sum+=lst[i]
return sum
sum1=num(lst)
print(sum1)
#老师思路
def get_digit(x):
s=0 #存储累加和
lst=[]
for item in x:
if item.isdigit():
lst.append(int(item))
#求和
s=sum(lst)
return lst,s
#准备函数的调用
s=input('请输入一个字符串:')
#调用
lst,x=get_digit(s)
print('提取的数字列表为:',lst)
print('累加和为:',x)
点击查看代码
实战三
#我的思路
str=input('请输入一个字符串:')
def fun(x):
lst=[]
for item in x:
if item.islower():
lst.append(item.upper())
elif item.isupper():
lst.append(item.lower())
else:
lst.append(item)
return lst
lst1=fun(str)
for i in range(0,len(lst1)):
print(lst1[i],end='')
print()
#老师思路
def lower_upper(x):#x是一个字符串,形式参数
lst=[]
for item in x:
if 'A'<= item <= 'Z':
lst.append(chr(ord(item)+32)) #ord()将字母转为Unicode码整数,加上32,char将整数转为字符
elif 'a'<= item <= 'z':
lst.append(chr(ord(item)-32))
else:
lst.append(item)
return ''.join(lst)
#准备调用
s=input('请输入一个字符:')
new_s=lower_upper(s)
print(new_s)
点击查看代码
实战四
def get_find(s,lst):
for item in lst:
if item==s:
return True
return False
lst=['hello','world','pathon']
s=input('请输入您要判断的字符串:')
result=get_find(s,lst)
print('存在' if result else '不存在')#if...else的简写,三元运算符 if result==True if result 利用对象的布尔值