免费的清晰思维导图见上传资源压缩包,也不需要积分。

其他篇目请点击Python合集。

使用函数可以让你的程序更容易扩展和维护,与必须修改多个地方相比,使用函数修改的效率更高。

1 定义函数

(1)指定函数名、完成任务所需信息(不需要输入时括号内为空)、以冒号结尾。

(2)函数体:紧跟在函数定义行后面的缩进行。

(3)注释:文档字符串,描述了函数是做什么的,用三引号括起 """注释"""

2 传递信息

2.1 形参与实参

2.1.1 基础知识

(1)在函数定义def function_name()的括号内添加形参,通过添加形参可以让函数接受输入给它的任何值。

(2)形参是一个变量,用于函数完成其工作所需的一项信息。

(3)实参是一个值,调用函数时传递给函数的信息。

(4)在调用函数时,将要让函数使用的信息放在括号内。

(5)调用函数时,将实参的值传递给了函数,这个值被存储在形参这个变量中

2.1.2 传递实参

(1)调用函数时,必须将函数调用中的每个实参度关联到函数定义中的一个形参。

(2)方法概述

传递实参的四种方法简述
方法 使用要求
位置实参 要求实参的顺序与形参的顺序相同
关键字实参 每个实参都由变量名和值组成
列表
字典

(3)位置实参:基于实参的顺序将实参和形参相关联。在函数中,可根据需要使用任意数量的位置实参,Python将按顺序将函数调用中的实参关联到函数定义中相应的形参。

(4)关键字实参:关键字实参是传递给函数的名称-值对,直接在实参中将名称和值关联起来了。

关键字实参无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。

关键字实参的顺序无关紧要,但是要准确指定函数定义中的形参名称。

(5)默认值: 编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,程序将使用指定实参值;否则将使用形参的默认值。

使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参。(在使用位置实参时这点非常重要)

(6)实参错误:提供的实参多于或少于函数完成其工作所需的信息时,将出现实参不怕匹配错误。

Traceback(most recent call last):File "*.py",line ,in<*>function_name()
TypeError:function_name() missing * required positional arguments:'*' and '*'

2.1.3 传递任意数量的实参

(1)Python允许函数从调用语句中收集任意数量的实参

(2)使用空元组*formal_parameter创建一个空元组,并将收到的所有值都封装在该元组中,即便只收到一个值也如此。

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

(3)使用空字典**formal_parameter创建一个空字典,接受任意数量的关键字实参,将收到的所有名称-值对都封装到这个字典中。

在这个函数中,可以像访问其他字典那样访问所返回字典的名称-值对。

(4)编写函数时,可以以各种方式混合使用位置实参、 关键字实参和任意数量的实参。

(5)使用方法概述:

传递任意数量的实参
表示方法 创建内容 使用要求
*formal_parameter 空元组 已知输入类型,未知输入具体数目
**formal_parameter 空字典 未知输入类型,未知输入具体数目

2.2 传递列表

(1)将列表传递给函数后,函数可以直接访问其内容。

(2)在函数中对这个列表所做的任何修改都是永久性的,可以高效大量处理数据。

(3)每个函数都应只负责一项具体的工作

(4)可以在一个函数中调用另一个函数,这有助于将复杂的任务划分成一系列的步骤。

(4)假如在调用函数处理完原列表后还要使用该列表,可以使用切片表示法[:]创建列表的副本,而丝毫不影响原件。

但使用切片表示法时需要花时间和内存创建副本,降低效率,处理大型列表时更甚,如果没有必须的理由,还是应当将原始列表传递给函数。

function_name(list_name[:])

3 返回值

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

(2)在函数中,可使用return语句将值返回到调用函数的代码行。

(3)调用返回值的函数时,需要提供一个变量,用于存储返回的值

(4)可选实参:将实参变为可选值,使用函数的人就只需在必要时才提供额外的信息,可使用默认值来让实参编程可选的,例如:给实参指定一个默认值——空字符串,可以搭配if语句在提供该实参和不提供该实参时输出不同内容。

可选实参要放在末尾定义。

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

(6)返回字典:函数接受值,并将这些值封装到字典中。

(7)结合while循环:函数可以结合任意一种Python结构使用。

4 将函数存储在模块中

4.1 使用模块的好处

(1)将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。

(2)通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上,可以在众多不同的程序中重用函数,还可以使用其他程序员编写的函数库。

4.1 模块的定义与使用

(1)创建模块:模块是扩展名为.py的文件,包含要导入到程序中的代码。

(2)应用模块:

应用模块
应用方法 引用方法 调用函数
导入整个模块 import module_name  module_name.function_name()
导入特定函数 from module_name import function_name function_name()
给函数指定别名 from module_name import function_name as fn fn()
给模块指定别名 import module_name as mn mn.function_name()
导入模块中所有函数 from module_name import * function_name()

5 函数编写指南

(1)给函数、模块命名时需要指定描述性名称,且只在其中使用小写字母和下划线

(2)每个函数都应包含简要注释(描述其功能),该注释应紧跟在函数定义后面,并采用文档字符串格式。

(3)给形参指定默认值时,等号两边不要有空格

(4)使用关键字形参时,等号两边不要有空格

(5)有多个形参时,可在函数定义中输入左括号后换行,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。

形参:2次Tab,8字符缩进

函数体:1次Tab,4字符缩进

def function_name(parameter_0,parameter_1,parameter_2,parameter_3,parameter_4,parameter_5):function body…

(6)若程序或模块中包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。

(7)所有import语句都应放在文件开头(当开头添加了对整个程序的注释是import语句在注释之后)。

6 课后题

题目在注释里,因为后面有一些是模块调用的代码,所以会分三个代码part。

#ex8-1 display_message
#编写名为display_message()的函数,打印一个句子,指出在本章学习了什么
#调用这个函数,确认显示的信息正确无误
print("ex8-1")def display_message():"""显示在本章学习了什么"""print("function")display_message()
print("\n")#ex8-2 favorite_book
#编写名为favorite_book()的函数,其中包含一个名为title的形参
#该函数打印一条消息,如:One of my favorite books is Alice in Wonderland.
#调用这个函数,并将一本书的名称作为实参传递给它
print("ex8-2")def favorite_book(title):print("One of my favorite books is "+title.title())favorite_book('alice in wonderland')
print("\n")#ex8-3 make_shirt()
#编写名为make_shirt()的函数,接受一个尺码以及要印到T恤上的字样
#这个函数应打印一个句子,概要地说明T恤的尺码和字样
#使用位置实参调用这个函数来制作一件T恤,再使用关键字实参来调用这个函数
print("ex8-3")def make_shirt(size,character):print("Hello,you ordered a T-shirt with size "+size.upper()+" and the word "+character.title()+".")make_shirt('xs','champion')print("\n")#ex8-4 make_shirt_2()
#在ex8-3的基础上修改函数make_shirt(),使其在默认情况下制作一件印有字样"I love Python"的大号T恤
#调用这个函数来制作如下T恤
#一件印有默认字样的大号T恤、一件印有默认字样的中号T恤、一件印有其他字样的T恤(尺码无关紧要)
print("ex8-4")def make_shirt_2(size,character='I love Python'):print("Hello,you ordered a T-shirt with size "+size.upper()+" and the word "+character.title()+".")make_shirt_2('l')
make_shirt_2(size='m')
make_shirt_2('s','I love C')
make_shirt_2(size='xs',character='I love C')print("\n")#ex8-5 describe_city()
#编写名为describe_city()的函数,接受一座城市的名字以及该城市所属的国家
#该函数应打印一个简单的句子,如Reykjavik is in Iceland.
#给用于存储国家的形参指定默认值
#为三座不同的城市调用这个函数,且其中至少有一座城市不属于默认国家
print("ex8-5")def describe_city(city_name,country='Iceland'):print(city_name+" is in "+country+".")describe_city('Reykjavik')
describe_city(city_name='Akareyi')
describe_city('New York','America')
describe_city(city_name='Shanghai',country='China')print("\n")#ex8-6 city_country()
#编写名为city_country()的函数,接受城市名称及其所属的国家
#函数返回一个格式如下的字符串:"Santiago,Chile"
#至少使用三个城市-国家对调用这个函数,并打印他返回的值
print("ex8-6")def city_country(city_name,country_name):city_country_dictionary={'city':city_name,'country':country_name,}return city_country_dictionarywhile True:print("\nPlease enter a city name and its country:")print("(enter 'q' at any time to quit)")city_name_in=input("Please enter the city name: ")if city_name_in=='q':breakcountry_name_in=input("Please enter the country name: ")if country_name_in=='q':breakfunction_in=city_country(city_name_in,country_name_in)print(function_in['city'].title()+","+function_in['country'].title())print("\n")#ex8-7 make_album()
#创建一个描述音乐专辑的字典
#该函数应接受歌手名和专辑名,并返回一个包含这两项信息的字典
#使用这个函数创建三个表示不同专辑的字典,并打印每个返回的值,以核实字典正确地存储了专辑的信息
#ex8-8 user_album
#基于ex8-7,编写一个while循环,让用户输入一个专辑的歌手和名称
#获取信息后调用函数make_album(),并将创建的字典打印出来
#在while循环中,务必提供退出途径
print("ex8-7 ex8-8")def make_album(singer_name,album_name):album_info={'singer':singer_name,'album':album_name}return album_infowhile True:print("Pls enter the singer name and one of his/her album's name: ")print("(enter 'q' at any time to quit)")singer_name_in=input("Pls enter the singer name: ")if singer_name_in=='q':breakalbum_name_in=input("Pls enter the album name: ")if album_name_in=='q':breaksinger_album=make_album(singer_name_in,album_name_in)print("Album "+singer_album['album'].title()+" is an album of singer "+singer_album['singer'].title()+"\n")print("\n")#ex8-8 show_magicians()
#创建一个包含魔术师名字的列表,并将其传递给一个名为show_magicians()的函数
#函数打印列表中每个魔术师的名字
print("ex8-8")def show_magicians(magicians):for magician in magicians:print(magician.title())magicians_name=['ann','anna','jenny']
show_magicians(magicians_name)print("\n")#ex8-9 make_great()
#编写make_great()的函数,对魔术师列表进行修改,在每个魔术师的名字中都加入字样"the Great"
#调用函数show_magicians(),确认魔术师列表确实改变了
print("ex8-9")magicians_name_2=[]def make_great(magicians):"""这个函数没办法符合预期运行,我没想明白为什么。。。"""for magician in magicians:magician='the Great'+magicianreturn magiciansdef show_magicians(magicians):for magician in magicians:print(magician.title())magicians_name_2=make_great(magicians_name)
show_magicians(magicians_name_2)print("\n")#ex8-10 make_great_2()
#基于ex8-9,在调用函数make_great()时,向它传递魔术师列表的副本
#由于不想修改原始列表,返回修改后的列表,并将其存储到另一个列表中
#分别使用两个列表来调用show_magicians(),确认一个列表包含的是原来的魔术师的名字, 而另一个列表包含的是添加了字样"the Great"的魔术师名字
print("ex8-10")def make_great_2(magicians,empty):while magicians:msg="the Great "+magicians.pop()empty.append(msg)def show_magicians_2(empty):for empty_element in empty:print(empty_element)empty_list=[]make_great_2(magicians_name[:],empty_list)
show_magicians_2(empty_list)print("\n")#ex8-12 make_sandwich()
#编写一个函数,接受顾客要在三明治中添加的一系列食材
#函数只有一个形参(收集函数调用中提供的所有食材),并打印一条消息概述顾客所点的三明治
#调用该函数3次,每次都提供不同数量的实参
print("ex8-12")def make_sandwich(*foodstuffs):print("\nThe following will be added to your sandwich: ")for foodstuff in foodstuffs:print("- "+foodstuff.title())make_sandwich('mayonnaise')
make_sandwich('mayonnaise','pickled cucumber')
make_sandwich('mayonnaise','pickled cucumber','tuna')print("\n")#ex8-13 user_profile_2
#基于user_profile.py,调用build_profile()来创建有关自己的简介
#调用该函数时,指定姓、名,以及三个描述自己的键值对
print("ex8-13")def user_profile_2(first,last,**my_info):profile={}profile['first_name']=firstprofile['last_name']=lastfor key,value in my_info.items():profile[key]=valuereturn profilemy_profile=user_profile_2('yiyao','wang',age=22,gender='female',education='bachelor degree')print(my_profile)print("\n")#ex8-14 make_car
#编写一个函数,将一辆汽车的信息存储在一个字典中
#这个函数总是接受制造商和型号,还接受任意数量的关键字实参
#这样调用这个函数:提供必不可少的信息,以及两个名称-值对,如颜色和选装配件
#这个函数必须能够满足如下调用:
#car=make_car('subaru','outback',color='blue',two_package=True)
#打印返回的字典,确认正确地处理了所有的信息
print("ex8-14")def make_car(manufacturer,model,**car_info):"""存储车辆信息"""car_profile={}car_profile['manufacturer']=manufacturercar_profile['model']=modelfor key,value in car_info.items():car_profile[key]=valuereturn car_profilecar_profile=make_car('subaru','outback',color='blue',two_package='True')
print(car_profile)print("\n")#8-15 print_models & printing_functions
#将示例print_models.py中的函数放在另一个printing_function.py的文件中
#在print_models.py的开头编写一条import语句,并修改这个文件以使用导入的函数
print("ex8-15")from ex08_functions import print_models,show_completed_modelsunprinted_designs=['iphone case','robot pendant','dodecahedron']
completed_models=[]print_models(unprinted_designs[:],completed_models)
show_completed_models(completed_models)
show_completed_models(unprinted_designs)print("\n")#ex8-16 import
#选择自己编写的且只包含一个函数的程序,并将这个函数放在另一个文件中
#在主程序文件中,使用下述各种方法导入这个函数
#这题用的本章节示例person
print("ex8-16")import personmusician=person.build_person('jimi','herdrix',age=27)
print(musician)print("----------------------------------------------------------")from person import build_personmusician=build_person('jimi','herdrix',age=27)
print(musician)print("----------------------------------------------------------")from person import build_person as bpmusician=build_person('jimi','herdrix',age=27)
print(musician)print("----------------------------------------------------------")import person as pmusician=p.build_person('jimi','herdrix',age=27)
print(musician)print("----------------------------------------------------------")from person import *musician=build_person('jimi','herdrix',age=27)
print(musician)print("----------------------------------------------------------")
#ex8-15 printing_functions
#ex8-5的函数集合
def print_models(unprinted_designs,completed_models):"""模拟打印每个设计,直到没有未打印的设计为止打印每个设计后,都将其移动到列表completed_models中"""while unprinted_designs:current_design=unprinted_designs.pop()#模拟根据设计制作3D打印模型的过程print("Printing model: "+current_design)completed_models.append(current_design)#打印函数
def show_completed_models(completed_models):"""显示打印好的所有模型"""print("\nThe following models have been printed: ")for completed_model in completed_models:print(completed_model)
def build_person(first_name,last_name,age=''):"""返回一个字典,其中包含有关一个人的信息"""person={'first':first_name,'last':last_name}if age:person['age']=agereturn person

参考书籍:Python编程从入门到实践(书籍) - 知乎

【毕设记录日记】Python基础内容笔记整理6:函数相关推荐

  1. Python基础学习笔记:匿名函数

    匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y):return x*y print(calc(2,3))# 换成匿名函数calc = lambda x,y: ...

  2. [机器学习]Python基础知识笔记整理

    机器学习主要语言Python,C++,把之前收集和总结的笔记: 目录列表: 字符编码声明 字符串String 列表list 列表与字符串 元组 字典dic 集合set 控制结构 猜拳游戏练习 列表生成 ...

  3. Python基础入门笔记(二)

    前言 本文主要为 Python基础入门笔记(一)内容的补充. 一.迭代器和生成器 1.1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元 ...

  4. Python基础学习笔记之(一)

    Python基础学习笔记之(一) zouxy09@qq.com http://blog.csdn.net/zouxy09 前段时间参加微软的windows Azure云计算的一个小培训,其中Pytho ...

  5. Python 基础学习笔记 03

    Python基础系列 Python 基础学习笔记 01 Python 基础学习笔记 02 Python 基础学习笔记 03 Python 基础学习笔记 04 Python 基础学习笔记 05 文章目录 ...

  6. Python基础学习笔记之(二)

    Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...

  7. python基础操作笔记

    python基础操作笔记 第二章 变量和简单的数据类型 #2.1输出数据hello world print('--------------------------------------------- ...

  8. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  9. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  10. Python基础学习笔记(一)

    Python基础学习笔记(一) 基本数据类型   整型(int):1.2.10--   浮点型(float):1.2.2.4.10.00--   布尔型(bool):True.False   字符串( ...

最新文章

  1. ios开发 自定义btn_iOS一步步实现一个高度自定义UIButton控件
  2. 使用Qt D-Bus适配器
  3. php获取src,PHP读取文件
  4. 【CF603E】Pastoral Oddities cdq分治+并查集
  5. 安装nodejs express框架时express命令行无效
  6. QDir的mkdir和mkpath区别
  7. 向上取整和向下取整(ceil、round)
  8. Linux jar包 后台运行
  9. 基于百度tts-实现文字转语音,支持下载,在线预览
  10. 肠道菌群失衡的症状、原因和自然改善
  11. 怎么将自己的头像p到特定的背景图_做个背景透明的头像,让自己的微信与众不同...
  12. Vue.js学习笔记(3)循环语句
  13. 在c语言中pwm的作用,详细注解的PWM c程序初学者适用
  14. 计算机一级簇型水平统计图,一级计算机考前水平试题及答案解析
  15. 2018 ACM-ICPC 宁夏预选赛网赛 B-Goldbach
  16. API身份验证和授权介绍
  17. 服务器的地址信息,服务器主机地址信息
  18. 机车车辆LED灯行业调研报告 - 市场现状分析与发展前景预测
  19. 计算机管理员基础知识,计算机网络管理员(基础知识)
  20. css表头固定样式的方法

热门文章

  1. WRF模式运行及相关问题的解决
  2. 大数据还能火多久?通俗说大数据、人工智能、机器学习之关系
  3. 服务器网站中断,如何解决无法打开网页及服务器已断开连接的问题?
  4. Android面试题汇总(适合Android中高级开发工程师)
  5. 微信图文排版指南-如何在图片上添加文字?
  6. 【Python项目】贪吃蛇小游戏
  7. 链游和元宇宙大热,互联网游戏从业者们如何看待它们? |链捕手
  8. 数据增强-亮度-对比度-色彩饱和度-色调-锐度 不改变图像大小 --增加ssd目标框xml文件的同步处理方法。
  9. vivo8.0系统机器最完美激活xposed框架的方法
  10. 2023年中央民族大学新闻学保研必看上岸前辈复习经验分享