python教程从入门到实践第八章_《Python编程从入门到实践》_第八章_函数

一个简单的函数

先看一个简单的函数

defsay_hello():'''打印hello'''

print("Hello!")

say_hello()#运行结果

Hello!

def为函数的关键字,say_hello为你定义的函数的名称,还可能在括号内指出函数为完成其任务需要什么样的信息,即便括号是空的,也是必不可少的,最后以冒号结尾。

向函数传递信息

defsay_hello(name):'''打印hello'''

print("Hello!" +name)

say_hello('Frank')#运行结果

Hello! Frank

这里在括号里面加了一个变量name,然后将'Frank'传递给了name,输出。

实参和形参

在函数say_hello的定义中,变量name是一个形参——函数完成其工作所需的一项信息。在代码say_hello('Frank')中,其'Frank'就是一个实参,实参是调用函数时传递给函数的信息。

传递实参

位置实参

你调用函数时,Python必须将函数调用中的每个实参都关联到函数定义的一个形参。为此,最简单的关联方式是基于实参的顺序,这种关联方式被称为位置实参,可以多次调用。

defintroduce(name,age):'''自我介绍'''

print("Hello! my name is" + name +"!" + "I'am" + age + "years old !")

introduce('Frank','18')#运行结果

Hello! my name is Frank !I'am 18 years old !

关键字实参

可以直接将形参和实参关联起来,这样就不必要在意顺序了。

defintroduce(name,age):'''自我介绍'''

print("Hello! my name is" + name +"!" + "I'am" + age + "years old !")

introduce(age='18',name='Candy')#运行结果

Hello! my name is Candy !I'am 18 years old !

默认值

可以给函数的形参指定一个默认值,当你给形参重新指定值的时候,会覆盖默认值。

def introduce(name,age='20'):'''自我介绍'''

print("Hello! my name is" + name +"!" + "I'am" + age + "years old !")

introduce(name='Candy')

introduce(age='23',name='Frank')#运行结果

Hello! my name is Candy !I'am 20 years old !

Hello! my name is Frank !I'am 23 years old !

返回简单值

函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。

defget_formatted_name(first_name,last_name):'''返回整洁的姓名'''full_name= first_name + ' ' +last_namereturnfull_name.title()

musician= get_formatted_name('jimi','hendrix')print(musician)#运行结果

Jimi Hendrix

让实参变为可选的

有的时候,我们不需要每个形参都有实参,但是没有实参会导致输出出错,可以看一下下面的例子:

def get_formatted_name(first_name,last_name,middle_name=''):'''返回整洁的姓名'''

ifmiddle_name:

full_name= first_name + ' ' + middle_name + ' ' +last_nameelse:

full_name= first_name + ' ' +last_namereturnfull_name.title()

musician= get_formatted_name('jimi','hendrix')print(musician)

musician= get_formatted_name('jimi','hendrix','dork')print(musician)#运行结果

Jimi Hendrix

Jimi Dork Hendrix

看上面的例子,并非所有的人都中间名,所有我们在指定实参的时候,middle_name不一定要有,这里我们用''空字符串来指定middle_name的默认值(空字符串为False),再用if判断用那种full_name的格式输出。

返回字典

def build_person(first_name,last_name,age=''):'''返回一个值,其中包含一个人的信息'''person= {"first":first_name,"last":last_name}ifage:

person['age'] =agereturn(person)

musician= build_person('jimi','hendrix','27')print(musician)#运行结果

{'first': 'jimi', 'last': 'hendrix', 'age': '27'}

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

结合使用while循环和函数

defget_formatted_name(first_name,last_name):'''返回整洁的姓名'''full_name= first_name + " " +last_namereturnfull_name.title()whileTrue:

f_name= input("Please input your first name:")

l_name= input("Please input your last name:")

name=get_formatted_name(f_name,l_name)print("hello!" +name)#运行结果

Please input your first name:bin

Please input your last name:liu

hello! Bin Liu

Please input your first name:

函数括号里面也可以是被赋值的变量名。

传递列表

可以将一个列表传递给形参

defgreet_users(names):'''遍历列表,打招呼'''

for name innames:print("Hello," + name + '!')

usernames= ["Frank","May","Caroline"]

greet_users(usernames)#运行结果

Hello, Frank!

Hello, May!

Hello, Caroline!

在函数中修改列表

defprint_models(upprint,completed):'''弹出已打印的给完成的列表,并打印'''

whileupprint:

current=upprint.pop()print("print:",current)

completed.append(current)defshow_models(completed):'''显示已打印的'''

print("The following models have been print:")for c incompleted:print(c)

upprint= ["apple","book","shirt"]

completed=[]

print_models(upprint,completed)

show_models(completed)#运行结果

print: shirtprint: bookprint: apple

The following models have beenprint:

shirt

book

apple

在这个例子中,函数执行结束后,upprint列表就空了,为了解决这个问题,可向函数传递列表的副本而不是原件,这样函数所做的任何修改都只影响副本,而不会影响原件。

def print_models(upprint[:],completed):

切片表示法[:],创建列表副本。

虽然向函数传递列表的副本可以保留原始的列表的内容,但除非有充分的理由需要传递副本,否则还是应该讲原始数据传递给函数,因为让函数使用现成列表可以避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。

传递任意数量的实参

有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参:

def make_pizza(*toppings):'''概述要制作的pizza'''

print("\nMaking a pizza with the following toppings:")for topping intoppings:print("--",topping)

make_pizza('pepperoni')

make_pizza('mushrooms','grenn peppers','extra cheese')#运行结果

Making a pizza with the following toppings:--pepperoni

Making a pizza with the following toppings:--mushrooms--grenn peppers-- extra cheese

形参名*toppings的星号让Python创建一个名为toppings的空元祖,并将收到的所有值都封装想到这个元祖中。

结合使用位置实参和任意数量实参

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python会先匹配实参和关键字实参,再将余下的实参都收集到最后一个形参中。

def make_pizza(size,*toppings):'''概述要制作的pizza'''

print("\nMaking a" + str(size) + "-inch pizza with the following toppings:")for topping intoppings:print("--",topping)

make_pizza(16,'pepperoni')

make_pizza(12,'mushrooms','grenn peppers','extra cheese')#运行结果

Making a 16-inch pizza with the following toppings:--pepperoni

Making a12-inch pizza with the following toppings:--mushrooms--grenn peppers-- extra cheese

使用任意数量的关键字实参

在下面的例子中,函数build_profile()接收名和姓,同时还接收任意数量的关键字和实参:

def build_profile(first_name,last_name,**info):'''创建一个字典,其中包含我们知道的有关用户的一切'''profile={}

profile["first_name"]=first_name

profile["last_name"]=last_namefor k,v ininfo.items():

profile[k]=vreturnprofile

user_profile= build_profile("bin","liu",location="princeton",field="physics")print(user_profile)#运行结果

{'first_name': 'bin', 'last_name': 'liu', 'location': 'princeton', 'field': 'physics'}

将函数存储在模块中

导入整个模块

例子:先创建一个打印方式make_pizza.py

#pizza打印方式模块

def make_pizza1(size,*toppings):'''概述要制作的pizza'''

print("\n Making a" + str(size) +

"-inch pizza with the following toppings:")for topping intoppings:print("----" +topping)def make_pizza2(size,*toppings):'''概述要制作的pizza'''

print("\nsize:",size)print("toppings:")for topping intoppings:print("====",topping)

在同一目录下创建:pizza.py

#pizza

importmake_pizza

make_pizza.make_pizza1(16,'pepperoni','mushrooms')

make_pizza.make_pizza2(16,'pepperoni','mushrooms')

运行结果:

Making a 16-inch pizza with the following toppings:----pepperoni----mushrooms

size:16toppings:====pepperoni==== mushrooms

要调用被导入的模块中的函数,可指定导入模块的名称make_pizza和函数名make_pizza1(),并用句点来分割他们。

这就是一种导入方法,只需编写一条import语句并在其中指定模块名,就可以在程序中使用该模块中的所有函数:module_name.function_name()

导入特定的函数

语法如下:

from module_name import function_name

通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数

from module_name import function_0, function1, function2

若使用这种语法,调用函数的时候就不需要使用句点了

#pizza打印方式模块 文件make_pizza.py

def make_pizza1(size,*toppings):'''概述要制作的pizza'''

print("\n Making a" + str(size) +

"-inch pizza with the following toppings:")for topping intoppings:print("----" +topping)def make_pizza2(size,*toppings):'''概述要制作的pizza'''

print("\nsize:",size)print("toppings:")for topping intoppings:print("====",topping)#pizza 文件pizza.py

from make_pizza importmake_pizza1,make_pizza2

make_pizza1(16,'pepperoni','mushrooms')

make_pizza2(16,'pepperoni','mushrooms')#运行结果

Making a 16-inch pizza with the following toppings:----pepperoni----mushrooms

size:16toppings:====pepperoni==== mushrooms

使用as给函数定义别名

#pizza

from make_pizza importmake_pizza1 as pz1,make_pizza2 as pz2

pz1(16,'pepperoni','mushrooms')

pz2(16,'pepperoni','mushrooms')#运行结果

Making a 16-inch pizza with the following toppings:----pepperoni----mushrooms

size:16toppings:====pepperoni==== mushrooms

语法:from module_name import function_name as fn

使用as给模块定义别名

#pizza

importmake_pizza as pz

pz.make_pizza1(16,'pepperoni','mushrooms')

pz.make_pizza2(16,'pepperoni','mushrooms')#运行结果

Making a 16-inch pizza with the following toppings:----pepperoni----mushrooms

size:16toppings:====pepperoni==== mushrooms

语法:import module_name as mn

导入模块中所有的函数

#pizza

from make_pizza import *make_pizza1(16,'pepperoni','mushrooms')

make_pizza2(16,'pepperoni','mushrooms')#运行结果

Making a 16-inch pizza with the following toppings:----pepperoni----mushrooms

size:16toppings:====pepperoni==== mushrooms

*可以代表前面指定模块里的所有函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值