函数
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (),圆括号之间可以用于定义参数
- 函数内容以冒号 : 起始,并且缩进,return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None
- 语法
def 函数名(参数列表):
函数体
参数传递
- 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象
- 实例:
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
可变类型:变量赋值 la=[1,2,3,4]后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
- python 传不可变对象实例:
通过 id() 函数来查看内存地址变化:
def change(a): print(id(a))
# 指向的是同一个对象
a=10 print(id(a))
# 一个新对象
a=1
print(id(a))
change(a)
结果为:
4379369136
4379369136
4379369424
-
在调用函数前后,形参和实参指向的是同一个对象(对象 id 相同),在函数内部修改形参后,形参指向的是不同的 id
-
传可变对象实例:
#!/usr/bin/python3 # 可写函数说明 def changeme( mylist ): "修改传入的列表" mylist.append([1,2,3,4]) print ("函数内取值: ", mylist) return # 调用changeme函数 mylist = [10,20,30] changeme( mylist ) print ("函数外取值: ", mylist)
传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:
函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
参数
调用函数时可使用的正式参数类型:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必需参数
- 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
- 调用 printme() 函数,你必须传入一个参数
- 实例:
#!/usr/bin/python3 #可写函数说明 def printme( str ): "打印任何传入的字符串" print (str) return # 调用 printme 函数,不加参数会报错 printme()
以上实例输出结果:
Traceback (most recent call last):
File "test.py", line 10, in <module>
printme()
TypeError: printme() missing 1 required positional argument: 'str'
关键字参数
-
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
-
使用关键字参数允许函数调用时参数的顺序与声明时不一致
以下实例在函数 printme() 调用时使用参数名:
#!/usr/bin/python3 #可写函数说明 def printme( str ): "打印任何传入的字符串" print (str) return #调用printme函数 printme( str = "菜鸟教程")
以上实例输出结果:
菜鸟教程
以下实例中演示了函数参数的使用不需要使用指定顺序:
## 实例(Python 3.0+)
#!/usr/bin/python3 #可写函数说明 def printinfo( name, age ): "打印任何传入的字符串" print ("名字: ", name) print ("年龄: ", age) return #调用printinfo函数 printinfo( age=50, name="runoob" )
以上实例输出结果:
名字: runoob
年龄: 50
默认参数
- 调用函数时,如果没有传递参数,则会使用默认参数。
- 实例:
def printinfo( name, age = 35 ): "打印任何传入的字符串" print ("名字: ", name) print ("年龄: ", age) return #调用printinfo函数 printinfo( age=50, name="runoob" ) print ("------------------------") printinfo( name="runoob" )
不定长参数
- 能处理比当初声明时更多的参数,声明时不会命名
- 语法:
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
注意:加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数,加了两个星号 ** 的参数会以字典的形式导入,如:
def functionname([formal_args,] **var_args_dict ):
"函数_文档字符串"
function_suite
return [expression]