第三章 函数设计

1. 【自定义函数】def语句

语法参考

使用def关键字可以实现定义一个函数,具体的语法格式如下:

def functionname([parameterlist]):
    ['''comments''']
    [functionbody]

参数说明如下:

  • functionname:函数名称,在调用函数时使用;

  • parameterlist:可选参数,用于指定向函数中传递的参数。如果有多个参数,各参数间使用逗号“,”分隔。如果不指定,则表示该函数没有参数。在调用时,也不指定参数;

注意:即使函数没有参数时,也必须保留一对空的小括号“()”,否则将显示错误提示对话框。

  • ‘’‘comments’‘’:可选参数,表示为函数指定注释,注释的内容通常是说明该函数的功能、要传递的参数的作用等,可以为用户提供友好提示和帮助的内容;

说明:在定义函数时,如果指定了’‘‘comments’’'参数,那么在调用函数时,输入函数名称及左侧的小括号时,就会显示该函数的帮助信息。这些帮助信息就是通过定义的注释提供的。

注意:如果在输入函数名和左侧括号后,没有显示友好提示,那么就检查函数本身是否有误,检查方法可以是在未调用该方法时,先按下快捷键执行一遍代码。

  • functionbody:可选参数,用于指定函数体,即该函数被调用后,要执行的功能代码。如果函数有返回值,可以使用return语句返回。

注意:函数体“functionbody”和注释“‘’‘comments’‘’”相对于def关键字必须保持一定的缩进。

锦囊1 定义一个空函数

如果想定义一个什么也不做的空函数,可以使用pass语句作为占位符。代码如下:

def emptyfuntion():
    pass

锦囊2 定义并调用一个函数

定义一个根据身高、体重计算BMI指数的函数fun_bmi(),该函数包括3个参数,分别用于指定姓名、身高和体重,再根据公式:BMI=体重/(身高×身高)计算BMI指数,并输出结果,代码如下:

def fun_bmi(person,height,weight):

    '''
       功能:根据身高和体重计算BMI指数
       person:姓名
       height:身高,单位:米
       weight:体重,单位:千克
    '''
    
    print(person + '的身高:' + str(height) + '米 \t 体重:' + str(weight) + '千克')
    bmi=weight/(height*height)                  		# 用于计算BMI指数,公式为“体重/身高的平方”
    print(person + '的BMI指数为:'+str(bmi))   			# 输出BMI指数

    # 判断身材是否合理
    if bmi < 18.5:
        print('偏瘦 ~@_@~')
    elif bmi < 23.9:
        print('正常 (-_-)')
    elif bmi < 28:
        print('偏胖 ~@_@~')
    else:
        print('肥胖 ^@_@^')


# 两种调用方式
fun_bmi("匿名",1.76,50)       							# 计算匿名的BMI指数
fun_bmi(height=1.76, weight=60, person='无语')       	# 计算匿名的BMI指数

锦囊3 定义并调用带默认值的函数

定义一个根据身高、体重计算BMI指数的函数fun_bmi(),该函数包括3个带默认值的参数,分别用于指定姓名、身高和体重,再根据公式:BMI=体重/(身高×身高)计算BMI指数,并输出结果,代码如下:

def fun_bmi(person='佚名',height=1.70,weight=60):

    '''
       功能:根据身高和体重计算BMI指数
       person:姓名
       height:身高,单位:米
       weight:体重,单位:千克
    '''

    print(person + '的身高:' + str(height) + '米 \t 体重:' + str(weight) + '千克')
    bmi=weight/(height*height)                  	# 用于计算BMI指数,公式为“体重/身高的平方”
    print(person + '的BMI指数为:'+str(bmi))   		# 输出BMI指数

    # 判断身材是否合理
    if bmi < 18.5:
        print('偏瘦 ~@_@~')
    elif bmi < 23.9:
        print('正常 (-_-)')
    elif bmi < 28:
        print('偏胖 ~@_@~')
    else:
        print('肥胖 ^@_@^')

调用fun_bmi()函数,各参数值都采用默认,代码如下:

fun_bmi()  					# 调用指定默认值的函数不指定参数值
fun_bmi('零语',1.65,55)  	# 调用指定默认值的函数时指定参数值

说明:在自定义函数时,如果即包含普通参数又包含带默认值的参数,那么带默认值的参数需要放在普通参数的后面。

锦囊4 定义并调用带可变参数*args的函数

定义一个根据身高、体重计算BMI指数的函数fun_bmi(),该函数只包括一个可变参数,用于指定测试人的姓名、身高和体重,再根据公式:BMI=体重/(身高×身高)计算测试人的BMI指数,并输出结果,代码如下:

def fun_bmi(*person):

    '''
       功能:根据身高和体重计算BMI指数
       *person:可变参数,需传递带3个元素的元组分别为姓名、身高(单位:米)、体重(单位:千克)
    '''

    for item in person:
        print('%s %s %s'%('='*13,item[0],'='*13))
        print('身高:%s 米 \t 体重:%s 千克'%(item[1],item[2]))
        bmi=item[2]/(item[1]*item[1])        		# 用于计算BMI指数,公式为“体重/身高的平方”
        print('BMI指数为:%f'%(bmi))   				# 输出BMI指数

说明:在上面的代码中,item为传递的元组,它的第一个元素为姓名(通过item[0]获取)、第二个元素为身高(通过item[1]获取),第三个元素为体重(通过item[2]获取)。

fun_bmi(('绮梦',1.70,60),('零语',1.78,62))

listperson = [('绮梦',1.70,60),('零语',1.78,62)]
fun_bmi(*listperson)  								# 使用已有的列表作为函数的可变参数

锦囊5 定义并调用带可变参数**kw的函数

定义一个根据身高、体重计算BMI指数的函数fun_bmi(),该函数只包括一个关键字可变参数,用于指定测试人的姓名、身高和体重,再根据公式:BMI=体重/(身高×身高)计算测试人的BMI指数,并输出结果,代码如下:

def fun_bmi(**person):
    '''功能:根据身高和体重计算BMI指数
       *person:可变参数,需传递带3个元素的元组分别为姓名、身高(单位:米)、体重(单位:千克)
    '''

    for value in person.values():  								# 遍历字典中的值
        print('%s %s %s'%('='*13,value[0],'='*13))
        print('身高:%s 米 \t 体重:%s 千克'%(value[1],value[2]))
        bmi=value[2]/(value[1]*value[1])         				# 用于计算BMI指数,公式为“体重/身高的平方”
        print('BMI指数为:%f'%(bmi))   							# 输出BMI指数

说明:在上面的代码中,value为传递的字典中的值,它的第一个元素为姓名(通过value[0]获取)、第二个元素为身高(通过value[1]获取),第三个元素为体重(通过value[2]获取)。

fun_bmi(p1=('绮梦',1.70,60),p2=('零语',1.78,62))

dictperson = {'p1':('绮梦',1.70,60),'p2':('零语',1.78,62)}
fun_bmi(**dictperson )  										# 使用已有的字典作为函数的可变参数

锦囊6 定义并调用带可变参数*args和普通参数结合的函数

定义一个包括可变参数*args和普通参数结合的自定义函数,在函数中,输出普通参数以及遍历输出可变参数的值,代码如下:

def printcoffee(*cn,name):
    print('欢迎光临%s咖啡馆~\n我店的咖啡有:'%name)
    for item in cn:  # 遍历输出可变参数*cn的值
        print(item)

调用自定义printcoffee()函数,传递可变参数和普通参数,代码如下:

printcoffee('蓝山','卡布奇诺','摩卡','哥伦比亚',name = '依米')

注意:在定义和调用带可变参数*args和普通参数的函数时,*args需要在前,普通参数在后。

锦囊7 定义并调用带可变参数**kw和普通参数结合的函数

定义一个包括可变参数*kw和普通参数结合的自定义函数,在函数中,输出普通参数以及遍历输出关键字可变参数的值,代码如下:

def printcoffee(name,**cn):
    print('欢迎光临%s咖啡馆~\n我店的咖啡有:'%name)
    for item in cn.values():  							# 遍历输出可变参数*cn的值
        print(item)

调用自定义printcoffee()函数,传递普通参数和关键字可变参数,代码如下:

printcoffee('依米',id1='蓝山',id2='卡布奇诺',id3='摩卡',id4='哥伦比亚')

注意:在定义和调用带可变参数**kw和普通参数的函数时,普通参数需要在前,**kw关键字参数在后。

锦囊8 定义并调用带返回值的函数

定义一个带返回值的自定义函数,在函数中,输出普通参数以及遍历输出关键字可变参数的值,代码如下:

def area(w,h):
    return w*h

调用自定义area()函数,传递矩形的宽度和高度,并输出返回结果,代码如下:

rect = area(450,200)
print('矩形面积:',rect)

2. 【匿名函数】lambda表达式

语法参考

在Python中,使用lambda表达式创建匿名函数,其语法格式如下:

result = lambda [arg1 [,arg2,……,argn]]:expression

参数说明如下:

  • result:用于调用lambda表达式;

  • [arg1 [,arg2,……,argn]]:可选参数,用于指定要传递的参数列表,多个参数间使用逗号“,”分隔;

  • expression:必选参数,用于指定一个实现具体功能的表达式。如果有参数,那么在该表达式中将应用这些参数。

注意:使用lambda表达式时,参数可以有多个,用逗号“,”分隔,但是表达式只能有一个,即只能返回一个值。而且也不能出现其他非表达式语句(如for或while)。

锦囊1 实现带参数的匿名函数

使用lambda表达式定义一个带参数的匿名函数,用于计算圆的面积,代码如下:

import math                       		# 导入math模块
r = 100                            		# 半径
result = lambda r:math.pi*r*r   		# 计算圆的面积的lambda表达式
print('半径为',r,'的圆面积为:',result(r))

锦囊2 实现带默认值参数的匿名函数

使用lambda表达式定义一个指定参数默认值的匿名函数,用于计算圆的面积,代码如下:

import math                            	# 导入math模块
result = lambda r = 100:math.pi*r*r   	# 计算圆的面积的lambda表达式
print('圆面积为:',result())           	# 不指定半径

锦囊3 在匿名函数后面直接传递参数

使用lambda表达式定义一个计算圆面积的匿名函数,并且在定义时直接在后面指定参数值,代码如下:

import math                                    	# 导入math模块

result = (lambda r :math.pi*r*r)(100)       	# 计算圆的面积的lambda表达式
print('圆面积为:',result)                    	# 不指定半径

锦囊4 将lambda表达式与map()函数结合使用

将lambda表达式作为map()函数的参数实现将列表中的全部英文名字转换为首字母大写,代码如下:

name = ['rose','aurora','jim','lily','lucy']
name = map(lambda x : x.capitalize(),name) # 将列表中的全部英文名字变为首字母大写

print(list(name))

锦囊5 将lambda表达式与filter()函数结合使用

使用lambda表达式指定filter()函数的过滤条件,实现过滤掉不符合条件的数据,代码如下:

# 过滤掉重复的元素,只要有重复的就两个都不保留
list1 = ['a','b','a','c']
list2= filter(lambda x : list1.count(x) == 1,list1)
print(list(list2))

# 保留年龄大于等于18岁的数据
list3 = [('无语',30),('琦琦',10),('明日',19)]
list3 = filter(lambda x : x[1]>18,list3)
print(list(list3))

锦囊6 指定tkinter模块中控件内联的回调(callback)函数

在使用tkinter模块的窗体中,通过lambda表达式为按钮控件指定单击后的回调(callback)函数,代码如下:

import sys  						# 导入操作系统模块
from tkinter import Button  		# 导入tkinter模块的Button控件

button = Button(text='单击按钮', command=(lambda:sys.stdout.write('愿你的青春不负梦想。\n')))
button.pack()       				# 将按钮放置到主窗口中
button.mainloop()   				# 进入消息循环

3. 【空语句】pass语句

语法参考

pass是一个空语句,不会输出任何内容,常被用作占位符,防止语法错误。如果循环体或者函数体为空,解释器就会报错。这时可以用pass语句来占位,以防止程序报错。pass语句语法格式如下:

pass

锦囊1 在选择语句中使用pass语句

要求输入一个整数,然后进行判断,如果是奇数,则输出该数,否则使用pass语句占位,以方便对不是奇数的情况进行处理。代码如下:

num = int(input('请输入一个整数:'))   # 输入一个数
if num % 2 != 0:                       # 判断是否为奇数
    print(num)
else:                                   # 不是奇数的情况
    pass                                # pass语句,用于占位

锦囊2 在循环语句中使用pass语句

在编写for循环时,如果没想好循环体中要进行的操作,可以先使用pass语句占位,例如下面的代码:

menu = ['0','1','2','3','4','5','6']  # 菜单编号
for opt in menu:  # 循环语句
pass  # 空语句

说明:在运行上面的代码时,并不会输出任何内容。

锦囊3 在循环和选择语句中使用pass语句

使用for语句输出1~9之间的奇数,在不是奇数的情况下,使用pass语句占位,以方便对不是奇数的情况进行处理。代码如下:

for i in range(1, 10):
    if i % 2 != 0:  		# 判断是否为奇数
        print(i)
    else:  					# 不是奇数的情况
        pass  				# pass语句,用于占位

说明:pass语句和注释之间的区别在于:解释器会完全忽略注释,但不会忽略pass语句。

锦囊4 在自定义函数中使用pass语句

定义一个函数func,但函数体部分暂时还没有完成,又不能空着不写内容,因此可以用pass来替代占个位置,以使程序可以正常运行。代码如下:

def func():
    pass

锦囊5 在创建类时使用pass语句

在创建类的时候用pass语句做一个占位符,以后再补充内容,代码如下:

class Geese:
    pass

4. 【生成器】yield语句

语法参考

yield语句可以在函数中定义生成器对象。它可以生成一个值的序列,以便于在迭代中使用。使用了yield语句的函数(也称生成器函数)与普通函数不同,普通函数调用一次返回一个值(如果没有return语句,则返回None),而生成器函数则会返回一个生成器对象,通过调用该对象的__next__()方法,可以不断地执行语句,直到遇到yield语句为止,并且在停止的地方生成一个结果。接下来还可以再次调用__next__()方法继续执行。

def functionname([parameterlist]):
    functionbody
    yield expression

参数说明如下:

  • functionname:函数名称,在调用函数时使用;

  • parameterlist:可选参数,用于指定向函数中传递的参数。如果有多个参数,各参数间使用逗号“,”分隔。如果不指定,则表示该函数没有参数。在调用时,也不指定参数;

  • functionbody:可选参数,用于指定函数中要执行的代码;

  • yield expression:用于生成一个结果。

锦囊1 使用yield语句实现一个生成器并迭代它

定义一个函数,在该函数中,创建一个死循环,然后在该循环中使用yield语句生成一个结果,然后再创建生成器对象,并且分3次调用它的__next__()方法,代码如下:

def fun():
    i = 0
    while True:
        yield i 		# 生成一个结果
        i += 1

f = fun() 				# 生成器对象
print(f.__next__())  	# 调用生成器对象的__next__()方法
print(f.__next__())  	# 调用生成器对象的__next__()方法
print(f.__next__())  	# 调用生成器对象的__next__()方法

虽然在函数中使用了死循环,但是并没有出现死循环,这是因为调用函数后,代码并不会开始执行,而是在调用__next__()方法时才开始执行,并且在遇到yield语句后,程序便会停下来,直到下次调用__next__()方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值