一、Python函数的定义和规则:
1、规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
2、函数的作用:
(1)、提高应用的模块性
(2)、提高代码的重复利用率
(3)、用来实现单一,或相关联功能的代码段
3、定义
语法:
def 函数名(参数列表):
函数体
实例:
def hello():
"""
仅用于展示函数定义
:return:
"""
print("Hello World")
hello() # 函数调用
# 计算面积函数
def area(width, height):
"""
根据宽高计算面积
:param width: 宽度
:param height: 高度
:return: 面积
"""
return width * height
def print_welcome(name):
"""
根据传入的名字打印欢迎"名字"
:param name:传入的名字
:return: 打印语句
"""
print("Welcome", name)
print_welcome("Wangdoudou")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
二、函数的具体使用
1、参数传递
(1)、可更改(mutable)对象:列表、字典,修改的跟原来的是同一个引用
def changeme(mylist):
"""
修改传入的列表
:param mylist:
:return:
"""
mylist.append([1, 2, 3, 4])
print("函数内取值: ", mylist)
return
# 调用changeme函数
mylist = [10, 20, 30]
changeme(mylist)
print("函数外取值: ", mylist)
(2)、不可更改(immutable)对象:字符串、数字、元组,传参时相当于重新生成了对象
a = "wangdoudou"
b = 15
def Changestr(a):
a = "haha"
def Changenum(b):
b = 20
Changestr(a)
Changenum(b)
print("a = ", a)
print("b = ", b)
2、函数参数:
函数定义时的参数为形参:调用时才分配内存单元,调用结束释放内存
调用函数时传入的参数值为实参
参数类型:
(1)、必需参数:须以正确的顺序传入函数。调用时的数量必须和声明时的一样
def printme(str):
"""
打印任何传入的字符串
:param str:
:return:
"""
print(str)
return
# 调用printme函数
printme("函数定义了几个参数,就必须传入几个参数")
(2)、关键字参数:允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值
def printinfo(name, age):
"""
打印任何传入的字符串
:param name: 名字
:param age: 年龄
:return:
"""
print("名字: ", name)
print("年龄: ", age)
return
# 调用printinfo函数
printinfo(age=50, name="wangdoudou")
(3)、默认参数:调用函数时,如果没有传递参数,则会使用默认参数
def printinfo(name, age=35):
"""
打印用户的名字和年龄
:param name:
:param age:
:return:
"""
print("名字: ", name)
print("年龄: ", age)
return
# 调用printinfo函数
printinfo(age=50, name="wangdoudou")
print("------------------------")
printinfo(name="wangdoudou")
(4)、不定长参数:处理比声明时更多的参数
一个星号*:参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
基本语法:
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
def printinfo(arg1, *vartuple):
print("输出: ")
print(arg1)
print(vartuple)
for var in vartuple:
print(var)
return
# 调用printinfo 函数
printinfo(10)
printinfo(70, 60, 50)
两个星号**:参数会以字典的形式导入
基本语法:
def functionname([formal_args,] **var_args_dict ):
"函数_文档字符串"
function_suite
return [expression]
def printinfo(arg1, **vardict):
print("输出: ")
print(arg1)
print(vardict)
# 调用printinfo 函数
printinfo(1, a=2, b=3)
一个星号和两个星号一块用:可接受任意长度,任意类型的参数
def test(x, *args, **kwargs):
print(x)
print(args, args[3])
print(kwargs, kwargs['y'])
test(1, 2, 3, 4, 5, 6, 7, y="hehe", z=110)
声明函数时,参数中星号 * 可以单独出现,如果单独出现星号 * 后的参数必须用关键字传入:
def f(a,b,*,c):
return a+b+c
错误调用:f(1,2,3)
正确调用:f(1,2,c=3)
5、return语句:return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None
def sum(arg1, arg2):
"""
返回2个参数的和
:param arg1:
:param arg2:
:return: 返回2个参数的和
"""
total = arg1 + arg2
print("函数内 : ", total)
return total
# 调用sum函数
total = sum(10, 20)
print("函数外 : ", total)
三、匿名函数:python 使用 lambda 来创建匿名函数,不再使用 def 语句这样标准的形式定义一个函数
1、定义
语法:
lambda [arg1 [,arg2,.....argn]]:expression
实例:
sum = lambda arg1, arg2: arg1 + arg2
print("相加后的值为 : ", sum(10, 20))
2、特性:
• lambda 只是一个表达式,函数体比 def 简单很多。
• lambda 的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
• lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
• lambda 函数的目的是调用小函数时不占用栈内存从而增加运行效率。
四、变量作用域:变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称
1、变量作用域类型
• L (Local) 局部作用域
• E (Enclosing) 闭包函数外的函数中
• G (Global) 全局作用域
• B (Built-in) 内建作用域
作用域排序:以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找
示例:
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
Tips:Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
2、全局变量和局部变量:定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域,局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
实例:
total = 0 # 这是一个全局变量
def sum(arg1, arg2):
total = arg1 + arg2 # total在这里是局部变量.
print("函数内是局部变量 : ", total)
return total
# 调用sum函数
sum(10, 20)
print("函数外是全局变量 : ", total)
3、global 关键字:内部作用域修改外部作用域的变量
实例:
num = 1
def fun1():
global num # 使用 global 关键字修改外部变量
print(num)
num = 123
print(num)
fun1()
print(num)
4、nonlocal关键字:修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量
实例:
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
print(num)
num = 100
print(num)
inner()
print(num)
outer()
五、函数作用域:输出的结果是从当前运行的代码块开始,然后逐级向上运行
name = "wangdoudou"
def printname():
name = "wangdoudou1"
def test():
name = "wangdoudou2"
print(name)
return test
# 第一种执行方式
printname()()
# 第二种执行方式
res = printname()
res()
输出结果: