python函数、函数参数、作用域

一、函数定义和调用

1. 函数的定义
1)定义函数关键字:def
2)作用:方便好用、复用性高
语法:

def 函数名():
	#函数内部代码

2. 函数的调用:函数名()

二、函数的返回值:return

1. return的作用:

  • 返回值数目=0:返回None
  • 返回值数目=1:返回object
  • 返回值数目>1:返回tuple

2 应用场景:
当需要返回结果的时候就用return,不需要返回的时候就不用
注意点:
· return是用来给函数返回结果的
· 当函数执行到return是函数执行结果
· 函数若没有定义return,默认返回None

三、函数参数

  • 参数的定义:函数名后面的括号中定义参数
  • 参数传递有两种形式:
    1 位置传参:按位置进行传参
    2 关键字传参:按关键字进行传参
    注意:混合方式传参时:关键字传参写在位置传参之后
  1. 形参:

    定义时小括号中的参数,用来接收实参用的,称为“形参”

  2. 实参:

    调用时小括号中的参数,用来传递给形参用的,称为“实参”

  3. 形参的定义有三种形式

1)必备参数

· 调用函数的时候必须要传的参数,即调用参数时的数量和定义函数时声明的数量一致,而且传入的位置和定义的位置顺序一致。
2)默认参数(缺省参数)
调用函数时,默认参数的值如果没有传入,则是默认值,否则使用传入的参数;
带有默认值的参数一定要位于参数列表的最后面
3)不定长参数
声明时不会命名,能处理比当初声明时更多的参数
*args
打印出来是个元组,用来接收未被其他参数接收的所有未命名的位置参数。
例如:

	def func(*args, **kwargs):
    print(args)
    print(kwargs)


func(11, 22, 33)

运行结果:

(11, 22, 33)
{}

**kwargs
打印出来是个字典,用来接收未被其他参数接收的所有命名的关键字参数,即key=value键值对保存在里面,我们可以通过for循环把kwargs里面的键值对遍历出来。
例如:

	def func(*args, **kwargs):
    print(args)
    print(kwargs)


func(11, 22, 33, a=100, b=200)

运行结果:

(11, 22, 33)
{'a': 100, 'b': 200}

注意:

  1. 调用的时候传参尽量统一风格(要么都通过位置传参,要么都使用关键字传参)
  2. 位置传参无法跳过默认参数,关键字传参可以跳过默认参数
  3. 超出的位置参数放在*args(元组)中
  4. 超出的关键字参数放在*kwargs(字典)中
  5. 拆包
    列表拆包:在列表前加一个 * 号。
    元组拆包:在元组前加一个 * 号。
    同理可以对字典、字符串、序列类型等进行拆包
    例如:
def func(*args, **kwargs):
    print(args)
    print(**kwargs)


data = (11, 22, 33)
# 未拆包
func(data)
# 拆包(通过*对元组拆包,只有在调用函数的时候可以用)
func(*data)

注意:两个*不能对字典拆包

四、函数的作用域

1. 全局变量:
在函数外部定义的变量,不论是函数外部还是内部都可以访问。
例如(在函数内部访问外部定义的变量):

a = 100


def func():
    print(a)


func()

运行结果:

100

2. 局部变量
在函数内部定义的变量,只能在函数内部使用,在函数外部无法调用。
例如:(在函数内部访问内部定义的变量):

def func():
    b = 100

    print(b)


func()

运行结果:

100

例如(在函数外部调用内部定义的变量):

def func():
    b = 100


func()
print(b)

运行结果:

Traceback (most recent call last):
  File "E:/PycharmProjects/py_01/py01_07test/02test.py", line 16, in <module>
    print(b)
NameError: name 'b' is not defined

注意点:
· 不同的函数,可以定义相同名字的局部变量,但是各用各的不会产生影响。
· 局部变量的作用:为了临时保存数据需要在函数中定义变量来进行存储。
3. global
在函数内部可以用global声明全局变量
例如:

def func():
    global b  # 在函数内部声明全局变量
    b = 99


func()
print(b)

运行结果:

99

注意点:

  • 使用global关键字修饰的变量不用提前定义
  • 在函数内部变量定义前,引用变量会提示错误,局部变量错误:在定义前引用的局部变量;因为变量的查找是由内向外查找的,先找自身的作用域中有没有,若没有才会去外面的作用域中去查找
  • 局部变量和全局变量的变量名最好不要相同,如果非要一样,那么要把局部变量的定义放在该函数的最前面
a = 100


def func():
    print(a)

    a = 200


func()

print(a)

运行结果:

Traceback (most recent call last):
  File "E:/PycharmProjects/py_test/py_test/test.py", line 19, in <module>
    func()
  File "E:/PycharmProjects/py_test/py_test/test.py", line 14, in func
    print(a)
UnboundLocalError: local variable 'a' referenced before assignment

扩展:
使用nonlocal声明外部函数的局部变量,可以在嵌套函数内部修改外部函数的局部变量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章