练习18--名称、变量、代码、函数
一 函数
1 功能
- 它们给代码片段命名,就跟“变量”给字符串和数字命名一样。
- 它们可以接受参数,就跟你的脚本接受 argv 一样。
- 通过使用 #1 和 #2,它们可以让你创建“微型脚本”或者“小命令”。
2 定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
3 定义规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式]
- 作用:返回函数中全部逻辑的执行结果并结束函数的执行
- 返回值存在以下情况:
- 没有显式定义,返回None
- 定义了一个返回值,返回定义的值
- 定义了多个函数返回值,返回一个以所有返回值为元素的元组
- 最后,函数的返回值可以是任意对象,字符串、函数等均可以作为函数的返回值。
4 语法:
def functionname( parameters ): "函数_文档字符串" function_suite return [expression]
5 使用函数的好处
- 提高代码的重用性,避免代码的重复冗余
- 保持一致性,相同的过程执行相同的逻辑
- 可扩展性好,函数中的代码块可根据需要灵活扩展
- 可维护性高,一旦需要改变逻辑时只需要修改函数中的代码块,一处修改后调用的地方都同步更新
二 练习代码
1 ex18.py
(1)代码内容:
# this one is like your scripts with argv def print_two(*args): arg1,arg2 = args print(f"arg1:{arg1},arg2:{arg2}") # ok,that *args is actually pointless,we can just do this def print_two_again(arg1,arg2): print(f"arg1:{arg1},arg2:{arg2}") # this just takes one argument def print_one(arg1): print(f"arg1:{arg1}") # this one takes no arguments def print_none(): print("I got nothing.") print_two("Zed","Shaw") print_two_again("Zed","Shaw") print_one("First!") print_none()
(2)代码讲解:
- 让我们把第一个函数拆解一下, print_two 这是你从创建脚本中已经学到的最熟悉的东西:
- 首先,我们告诉 Python 我们想要用 def (即 define)来创建一个函数。
- 在 def 的同一行我们给了函数一个名字,本例中是 print_two ,但是你也可以起名叫“peanuts”(花生),名字没关系,不过最好简短一些,并且能够说明这个函数的作用。
- 然后我们告诉它我们想要 *args ,它很像参数 args ,只不过是为函数设的,必须放在括号里面才能工作。
- 然后我们以 : 结束这一行,另起一行开始缩进。
- 在 : 之后缩进四个空格的所有行都是关于 print_two 这个函数名的。我们第一个缩进的行就是用来解包这个参数(argument),跟之前的脚本一样。
- 要表明它是如何工作的,我们把这些参数打印了出来,就像我们在脚本中所做的一样。
- print_two 的问题是它不是创建一个函数最简单的方法。在 python 里面,我们可以跳过整个解包参数的过程,只用我们需要的 () 里面的名字即可,这也正是 print_two_again的事情。之后我们用一个参数创建了 print_one 这个函数。最后我们创建了一个没有参数的函数 print_none 。
- *args 中的 *是什么作用? 这是告诉 Python 取所有的参数给函数,然后把它们放在 args 里放成一列,很像你之前学的 argv ,只不过这个是为函数设置的。这种不常用,除非有特殊需要。
(3)运行结果:
PS E:\3_work\4_python\2_code_python\02_LearnPythonTheHardWay> python ex18.py
arg1:Zed,arg2:Shaw
arg1:Zed,arg2:Shaw
arg1:First!
I got nothing.
2 checklist.py
(1)代码内容
def checklist(*args): print("1 你是否用def来创建函数了?") print("2 你的函数名是只包含字母和 _ (下划线)吗?") print("3 你在函数名后面放( (左圆括号)了吗?") print("4 你在左圆括号后面放参数(argument)了吗?参数之间是以逗号隔开的吗?") print("5 你的每个参数是唯一的吗(即没有重名)?") print("6 你在参数后面放 ) (右圆括号)和 : (冒号)了吗?") print("7 你在与这个函数相关的代码行前面加上四个空格的缩进了吗?(不能多也不能少)") print("8 你是通过另起一行不缩进来结束你的函数的吗?") print("\n") print("当你运行(或者调用)一个函数时,检查以下事项:") print("1 你是通过输入函数名称来运行/调用/使用一个函数的吗?") print("2 你运行的时候有在名称后面加 ( 吗?") print("3 你有把你想要的值放在圆括号里并用逗号隔开吗?") print("4 你是以 ) 来结束调用这个函数的吗?") checklist()
(2)执行结果
PS E:\3_work\4_python\2_code_python\02_LearnPythonTheHardWay> python checklist.py 1 你是否用def来创建函数了? 2 你的函数名是只包含字母和 _ (下划线)吗? 3 你在函数名后面放( (左圆括号)了吗? 4 你在左圆括号后面放参数(argument)了吗?参数之间是以逗号隔开的吗? 5 你的每个参数是唯一的吗(即没有重名)? 6 你在参数后面放 ) (右圆括号)和 : (冒号)了吗? 7 你在与这个函数相关的代码行前面加上四个空格的缩进了吗?(不能多也不能少) 8 你是通过另起一行不缩进来结束你的函数的吗? 当你运行(或者调用)一个函数时,检查以下事项: 1 你是通过输入函数名称来运行/调用/使用一个函数的吗? 2 你运行的时候有在名称后面加 ( 吗? 3 你有把你想要的值放在圆括号里并用逗号隔开吗? 4 你是以 ) 来结束调用这个函数的吗?