《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 !I‘am 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 !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 !

返回简单值

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

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

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

时间: 2024-08-02 01:39:07

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

《Python编程从入门到实践》第二章_变量和简单数据类型

什么是变量呢? 举例: >>> message = "Hello,Python!" >>> print (message) Hello,Python! 这里的message就是变量.在程序中可随时修改变量的值,而python将始终记录变量的最新值. 变量命令的规则有哪些呢? 变量只能包含字母数字下划线. 变量名不能包含空格,但可以使用下划线来分割其中的单词 不要将python关键字和函数名作为变量名 变量名应既简单又具有描述性 慎用小写字符l和大写字

《Python编程从入门到实践》_第十章_文件和异常

读取整个文件 文件pi_digits.txt #文件pi_digits.txt 3.1415926535 8979323846 2643383279 下面的程序打开并读取整个文件,再将其内容显示到屏幕中: with open("pi_digits.txt") as fileobject: contents = fileobject.read() print(contents) #运行结果 3.1415926535 8979323846 2643383279 使用函数open()打开文件

分享 《Python编程从入门到实践》+PDF+源码+EricMatthes+袁国忠

下载:https://pan.baidu.com/s/1pUlPpTMnffNgMfovUbZkJg 更多资料分享:http://blog.51cto.com/14087171 Python编程从入门到实践(高清中文版PDF+高清英文版PDF+源代码) 久负盛名的python入门书籍. 高清中文版462页,带目录和书签,文字可以复制粘贴: 高清英文版562页,带目录和书签,文字可以复制粘贴: 中文和英文两版对比学习: 讲解详细并配有源代码. 其中,高清中文版如图: 原文地址:http://blo

《矩阵分析与应用(第2版)张贤达》PDF+《Python编程从入门到实践》中英文PDF+源代码

下载:https://pan.baidu.com/s/1R8hwv-PZ7DYsl_gUtLWrag <矩阵分析与应用(第二版)张贤达>PDF 下载:https://pan.baidu.com/s/1hxfM_cL7hGpz7baorzuTjw <Python编程从入门到实践>(高清中文版PDF+高清英文版PDF+源代码) 下载:https://pan.baidu.com/s/1oRGp4_LfDVLo86r79pnXvg <凸优化>中文版PDF+英文版PDF+习题题解

《Python编程从入门到实践》+《流畅的Python》+《Python基础教程(第3版)》分析对比

<Python编程从入门到实践>针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib.NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表.字典.if 语句.类.文件与异常.代码测试等内容:第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的Python 2D 游戏开发如何利用数据生成交互式的信息图,以及创建和定制简单的Web 应用,并帮读者解决常见编程问题和困惑. <

《Python编程从入门到实践》(高清中文版PDF+高清英文版PDF+源代码)

<Python编程从入门到实践>(高清中文版PDF+高清英文版PDF+源代码)确实是非常适合初学者入门的python神书,文笔精炼,内容浅显易懂,还有源代码可做书里的练习题,找到了高清版和大家分享 https://pan.baidu.com/s/15OxbsPVHKFaBXfGy94l6BQ,无提取码 原文地址:https://blog.51cto.com/14218102/2355881

Python编程 从入门到实践 PDF 下载

网盘下载:Python编程 从入门到实践 PDF 下载 – 易分享电子书PDF资源网 作者: [美]埃里克·马瑟斯 出版社: 人民邮电出版社 副标题: 从入门到实践 原作名: Python Crash Course 译者: 袁国忠 出版年: 2016-7-1 页数: 459 定价: CNY 89.00 装帧: 平装 内容简介 · · · · · · 本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括mat

【PDF下载】Python编程 从入门到实践 PDF 下载

网盘下载:Python编程 从入门到实践 PDF 下载 – 易分享电子书PDF资源网 作者: [美]埃里克·马瑟斯 出版社: 人民邮电出版社 副标题: 从入门到实践 原作名: Python Crash Course 译者: 袁国忠 出版年: 2016-7-1 页数: 459 定价: CNY 89.00 装帧: 平装 内容简介 · · · · · · 本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括mat

Python编程从入门到实践

Python编程从入门到实践1 起步2 变量和简单数据类型3 列表简介4 操作列表5 if语句6 字典7 用户输入和while循环8 函数9 类10 文件和异常11 测试代码12 武装飞船13 外星人14 记分15 生成数据16 下载数据17 使用API18 Django19 用户账户20 设置应用程序的样式并对其进行部署21 附录 原文地址:https://www.cnblogs.com/huanyi0723/p/10807802.html

Python编程从入门到实践(第三、四章的列表和元祖) &#142015;

原文: http://blog.gqylpy.com/gqy/414 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我