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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python编程从入门到实践》_第八章_函数相关的知识,希望对你有一定的参考价值。

一个简单的函数

先看一个简单的函数

def say_hello():
    ‘‘‘打印hello‘‘‘
    print("Hello!")
say_hello()
#运行结果
Hello!

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

 

向函数传递信息

def say_hello(name):
    ‘‘‘打印hello‘‘‘
    print("Hello! " + name)
say_hello(Frank)
#运行结果
Hello! Frank

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

 

实参和形参

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

 

传递实参

位置实参

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

def introduce(name,age):
    ‘‘‘自我介绍‘‘‘
    print("Hello! my name is " + name +" !" + "I‘am " + age + " years old !")
introduce(Frank,18)
#运行结果
Hello! my name is Frank !Iam 18 years old !

关键字实参

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

def introduce(name,age):
    ‘‘‘自我介绍‘‘‘
    print("Hello! my name is " + name +" !" + "I‘am " + age + " years old !")
introduce(age=18,name=Candy)
#运行结果
Hello! my name is Candy !Iam 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 !Iam 20 years old !
Hello! my name is Frank !Iam 23 years old !

 

 

返回简单值

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

def get_formatted_name(first_name,last_name):
    ‘‘‘返回整洁的姓名‘‘‘
    full_name = first_name +   + last_name
    return full_name.title()
musician = get_formatted_name(jimi,hendrix)
print(musician)
#运行结果
Jimi Hendrix

 

 

让实参变为可选的

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

def get_formatted_name(first_name,last_name,middle_name=‘‘):
    ‘‘‘返回整洁的姓名‘‘‘
    if middle_name:
        full_name = first_name +   + middle_name +   + last_name
    else:
        full_name = first_name +   + last_name
    return full_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}
    if age:
        person[age] = age
    return(person)
musician = build_person(jimi,hendrix,27)
print(musician)
#运行结果
{first: jimi, last: hendrix, age: 27}

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

 


结合使用while循环和函数

def get_formatted_name(first_name,last_name):
    ‘‘‘返回整洁的姓名‘‘‘
    full_name = first_name + " " + last_name
    return full_name.title()
while True:
    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:

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

 

传递列表

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

def greet_users(names):
    ‘‘‘遍历列表,打招呼‘‘‘
    for name in names:
        print("Hello, " + name + !)
usernames = ["Frank","May","Caroline"]
greet_users(usernames)
#运行结果
Hello, Frank!
Hello, May!
Hello, Caroline!

 

 

在函数中修改列表

def  print_models(upprint,completed):
    ‘‘‘弹出已打印的给完成的列表,并打印‘‘‘
    while upprint:
        current = upprint.pop()
        print("print:",current)
        completed.append(current)
def show_models(completed):
    ‘‘‘显示已打印的‘‘‘
    print("The following models have been print:")
    for c in completed:
        print(c)
upprint = ["apple","book","shirt"]
completed = []
print_models(upprint,completed)
show_models(completed)
#运行结果
print: shirt
print: book
print: apple
The following models have been print:
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 in toppings:
        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 in toppings:
        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 a 12-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_name
    for k,v in info.items():
        profile[k]=v
    return profile
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 in toppings:
        print("----" + topping)
def make_pizza2(size,*toppings):
    ‘‘‘概述要制作的pizza‘‘‘
    print("\nsize:",size)
    print("toppings:")
    for topping in toppings:
        print("====",topping)

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

#pizza
import make_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: 16
toppings:
==== 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 in toppings:
        print("----" + topping)
def make_pizza2(size,*toppings):
    ‘‘‘概述要制作的pizza‘‘‘
    print("\nsize:",size)
    print("toppings:")
    for topping in toppings:
        print("====",topping)
#pizza  文件pizza.py
from  make_pizza import make_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: 16
toppings:
==== pepperoni
==== mushrooms

 

使用as给函数定义别名

#pizza
from  make_pizza import make_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: 16
toppings:
==== pepperoni
==== mushrooms

 语法:from module_name import function_name as fn

 

使用as给模块定义别名

#pizza
import  make_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: 16
toppings:
==== 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: 16
toppings:
==== pepperoni
==== mushrooms

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

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 


以上是关于《Python编程从入门到实践》_第八章_函数的主要内容,如果未能解决你的问题,请参考以下文章

《Python从入门到实践》--第八章 函数 课后练习

《Python从入门到实践》第八章动手试一试

社区共读《Python编程从入门到实践》第四天阅读建议

社区共读《Python编程从入门到实践》第四天阅读建议

第八章python元类编程

《Python编程从入门到实践》_第五章_if语句