参数类型与匿名函数
Python第四阶段
动态语言与静态语言
动态语言与静态语言
类型指定和检查
python是动态语言,新建变量时不需要声明与指定类型。自定义函数时也是如此。但是,在python3.5之后,就新增了对函数参数和返回值的类型指定和检查,以及在新建变量时也可以指定类型。
def f(a:int,b:str)-> str:
c=a*b
print(c)
return f
f(3,'zhongguo!')
类型指定和检查
指定了输入参数a为int类型,而b为str类型,并且返回值为srt类型。可以看到,在方法中,最终返回了一个str。当我们在调用这个函数时,但如果参数a输入的是字符串,实际上运行不会报错,毕竟python的本质还是动态语言。
def f(a:int,b:str)-> str:
c=a*b
print(c)
return f
f(3,'zhongguo!')
所谓的匿名函数(anonymous function)是指一个没有名称的函数,Python是使用def定义一般函数,匿名函数则是使用lambda来定义,有的人称之为lambda表达式,也可以将匿名函数称lambda函数。通常会将匿名函数与Python的内置函数filter( )、map( )等共同使用,此时匿名函数将只是这些函数的参数。
arg:匿名函数的参数
expression:函数内部需要执行的表达式
lambda arg1[, arg2, …, argn]:expression
返回x的平均值
square = lambda x:x ** 2
print(square(10))
匿名函数有多个参数的应用
product = lambda x,y : x * y
print(product(5,10))
练习:请编写一个函数,参数为一个列表,筛选出这个列表当中所有的奇数,然后将它们组合成一个新的列表
答案
mylist = [5,10,15,20,25,30]
def oddfn(mylist):
result = []
for item in mylist:
if item % 2 == 1:
result.append(item)
return result
匿名函数一般是用在不需要函数名称的场合,例如,一些高阶函数(higher-order function)的参数可能是函数,这时就很适合使用匿名函数,同时让程序变得更简洁。有一个内置函数filter( ),它的语法格式如下:
filter(function, iterable)
上述函数将依次对iterable(可以重复执行,例如,字符串string、列表list或元组tuple)的元素(item)放入function(item)内,然后将function( )函数执行结果是True的元素(item)组成新的筛选对象(filter object)返回。
filter(function, iterable)
使用传统函数将奇数的元素筛选出来
def oddfn(x):
if x % 2 == 1:
return True
else:
return False
mylist = [5,10,15,20,25,30]
filter_object = filter(oddfn,mylist)
print("奇数列表:",list(filter_object))
使用匿名函数完成程序
mylist = [5,10,15,20,25,30]
filter_object = filter(lambda x: x % 2 == 1 ,mylist)
print("奇数列表:",list(filter_object))
编写一个程序,计算1-1000所有的能够被4整除的数据,并将它们组合成一个列表
答案
print(list(filter(lambda x: x % 4 == 0,range(1,1001))))
练习:编写一个程序,计算1900-2000的所有闰年
答案
print(list(filter(lambda x:(x % 4 == 0 and x % 100 != 0) or x % 400 == 0,range(1900,2001))))
公历年份是4的倍数,且不是100的倍数,为普通闰年。公历年份是整百数,且必须是400的倍数才是世纪闰年。
map(function,iterable)
上述函数将依次对iterable(可以重复执行,例如,字符串string、列表list或元组tuple)的元素(item)放入function(item)内,然后将function( )函数执行结果组成新的筛选对象(filter object)返回。
map(function,iterable)
使用匿名函数对列表元素进行计算平方
mylist = [5,10,15,20,25,30]
squarelist = list(map(lambda x: x **2,mylist))
print(squarelist)
练习:编写一个函数,给出15个同学的成绩,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示,将结果组合成一个列表
答案
def judge(x):
if x >= 90:
return 'A'
if x >= 60:
return 'B'
else:
return 'C'
score = [67,90,78,56,90,67,98,78,65,87,96,85,84,93,40]
print(list(map(judge,score)))
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
答案
x = int(input())
print((lambda x:(x >= 90 and 'A' or x >= 60 and 'B' or 'C'))(x))
编写一个函数,找出一个整数的所有因子,并组合成列表返回
例如:6的因子有1 2 3
答案
def factor(number):
result = []
for i in range(1,number):
if number % i == 0:
result.append(i)
return result
number = int(input())
print(factor(number))
请尝试将上面的例子使用lambda表达式来完成
答案
number = int(input())
print(list(filter(lambda x:number % x == 0,range(1,number))))