EX18: Names,Variables,Code,Functions
-
例子:
def print_two(*args): arg1, arg2 = args print(f"arg1: {arg1}, arg2: {arg2}") def print_two_again(arg1, arg2): print(f"arg1: {arg1}, arg2: {arg2}") def print_one(arg1): print(f"arg1: {arg1}") def print_none(): print("I got nothin'.") print_two("Zed","Shaw") print_two_again("Zed","Shaw") print_one("First!") print_none()
-
学习内容:函数(
def
)-
函数(
def
)-
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
-
语法格式:
def 函数名(参数列表): 函数体
return [表达式]
结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
-
参数类型:
-
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
创建函数的参数有多少个,就要传入相应的参数个数,否则会报错。
输入:
def printtest(str): print(str) printtest(2)
结果:
2
-
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为
Python
解释器能够用参数名匹配参数值。输入:
def printtest(str1, str2): print(str1, str2) printtest(str2 = 2, str1 = 1)
结果:
1 2
-
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。
输入:
def printtest(str1, str2 = 1): print(f"str1:{str1}, str2有默认值为1, str2:{str2}") printtest(str1 = 1, str2 = 10) printtest(str1 = 1)
结果:
str1:1, str2有默认值为1, str2:10 str1:1, str2有默认值为1, str2:1
注意:在编程中出现
non-default parameter follows default parameter
错误原因是:将没有默认值的参数在定义时放在了有默认值的参数的后面,即def printtest(str2 = 1, str1):
,这样会报错。 -
不定长参数
加了星号
*
的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。输入:
def printtest(str1, *str): print(str1, str) printtest(1, 2, 3, 4, 5)
结果:
1 (2, 3, 4, 5)
加了两个星号
**
的参数会以字典的形式导入。输入:
def printtest(str1, **str): print(str1, str) printtest(1, a=2, b=3, c=4, d=5)
结果:
1 {'a': 2, 'b': 3, 'c': 4, 'd': 5}
-
-
-
-
改变代码(寻找可能情况及错误)
-
用
from sys import argv
改写输入:
from sys import argv script, a1, a2 = argv def print_two(*args): arg1, arg2 = args print(f"arg1: {arg1}, arg2: {arg2}") def print_two_again(arg1, arg2): print(f"arg1: {arg1}, arg2: {arg2}") def print_one(arg1): print(f"arg1: {arg1}") def print_none(): print("I got nothin'.") print_two(a1, a2) print_two_again(a1, a2) print_one(a1) print_none()
增加了交互性,不需要在代码上修改参数值。
结果:
python TEST.py Zed Shaw arg1: Zed, arg2: Shaw arg1: Zed, arg2: Shaw arg1: Zed I got nothin'.
-
用
input()
改写(结合.split()
,一行代码完成变量赋值)输入:
def print_two(*args): arg1, arg2 = args print(f"arg1: {arg1}, arg2: {arg2}") def print_two_again(arg1, arg2): print(f"arg1: {arg1}, arg2: {arg2}") def print_one(arg1): print(f"arg1: {arg1}") def print_none(): print("I got nothin'.") a1, a2 = input().split() print_two(a1, a2) print_two_again(a1, a2) print_one(a1) print_none()
用
input()
询问输入内容,再将内容运用到函数上,.split()
代表用输入内容的间隔用什么代表分割,默认是空格。结果:
python TEST.py Zed Shaw arg1: Zed, arg2: Shaw arg1: Zed, arg2: Shaw arg1: Zed I got nothin'.
-
用
.format()
代替f-String
输入:
def print_two(*args): # arg1, arg2 = args # 用.format()可以不需要此行。 print("arg1: {}, arg2: {}".format(*args)) def print_two_again(arg1, arg2): print("arg1: {}, arg2: {}".format(arg1, arg2)) def print_one(arg1): print("arg1: {}".format(arg1)) def print_none(): print("I got nothin'.") a1, a2 = input().split() print_two(a1, a2) print_two_again(a1, a2) print_one(a1) print_none()
结果:
python TEST.py Zed Shaw arg1: Zed, arg2: Shaw arg1: Zed, arg2: Shaw arg1: Zed I got nothin'.
-
用
for
循环扩充输入的参数数量输入:
def print_two(*args): j = 1 for i in args: print(f"agr{j}:",i,end = " ") j = j+1 print() def print_two_again(arg1, arg2): print(f"arg1: {arg1}, arg2: {arg2}") a, b, c, d = input().split() print_two(a, b, c, d) print_two_again(a, b)
print()
可用于换行,这样在调用其他函数就不会在同一行输出。如果print('\n')
会导致换行两次,因为print()
默认换行,再执行一次\n
,这样就有两次换行。for i in args
:for
循环可以遍历任何序列的项目,如一个列表或者一个字符串。结果:
python TEST.py Zed Shaw Hello World agr1: Zed agr2: Shaw agr3: Hello agr4: World arg1: Zed, arg2: Shaw
-