python3基础笔记(三)函数与全局、局部变量

一、函数

 使用函数可以

  • 减少代码重用。
  • 保持一致性,容易维护。
  • 可扩展性。

  1.函数的定义方法:

def function(x):
    x+=1
    return x
    • def:定义函数的关键字。
    • function:函数名。
    • 函数名后括号内的变量表示函数的参数(可以是0个或多个参数)
    • 冒号代表一个代码块的开始。
    • x+=1处是函数的代码块
    • return:函数的返回值,如果不写return默认返回None
      • 可以返回多个值(用逗号分割)python会吧这些值组成一个元祖返回。
      • 当函数遇到 return 时直接跳出函数。

  2.函数的参数

    • 函数在定义时的参数叫函数的形参。
    • 函数在调用时候的参数叫函数的实参。
    • 函数在定义时候不会分配内存空间,只有在调用时才会分配内存空间。

  3.位置参数和关键字

    关键字参数必须在所有位置参数之后。

def function(a, b):
    print("a={0},b={1}".format(a, b))
    return a,b

function(1,2)            #位置参数必须和函数的参数必须一一对应。缺一不可
function(b=3, a=0)    #关键字参数    指定关键字赋值 顺序不需要一一对应。同样也缺一不可。

  输出:

a=1,b=2
a=0,b=3

  4.默认参数

def function(a, b,c=100):
    print("a={0}, b={1}, c={2}".format(a, b, c))
    return a,b

function(1,2)            #不指定默认参数 取默认值
function(b=3, a=0)    #不指定默认参数 取默认值
function(1, 2, 3)        #指定默认参数

  输出:

a=1, b=2, c=100
a=0, b=3, c=100
a=1, b=2, c=3

    

  5.参数组(非固定长度参数)

  不定长参数:

    若传入一个列表,则吧列表也当做一个元素。

def function(a,*args):
    print(a)
    print(args)
    return None

function(1,2,3,4,5,76)
function(1,[1,2,3,4,5])

  输出:

1
(2, 3, 4, 5, 76)
1
([1, 2, 3, 4, 5],)

 


  若传入一个列表需要在列表前加一个*(星)

  例如:

def function(a,*args):
    print(a)
    print(args)
    return None

function(1,2,3,4,5,76)
function(1,*[1,2,3,4,5])

  输出:

1
(2, 3, 4, 5, 76)
1
(1, 2, 3, 4, 5)

  

  不定长关键字:

def function(a, **kwargs):
    print(a)
    print(kwargs)
    return None

function(1, x=2, y=3)

  输出:

1
{'y': 3, 'x': 2}

  


  若传入一个字典需要在字典前加 **(两个星)

  例如:

def function(a, **kwargs):
    print(a)
    print(kwargs)
    return None

function(1, x=2, y=3)
function(1,**{'one': 1, '2':2, 'name':'zjs'})

  输出:

1
{'x': 2, 'y': 3}
1
{'one': 1, 'name': 'zjs', '2': 2}

  6.函数的递归

  

def function(n):
    if n == 1:
        return n
    else:
        s = n + function(n-1)
    return s

res = function(4)
print(res)

  

  该程序完成的功能是获得 n + (n-1) + (n-2) + ... + 1 相加的和

  程序执行流程如下:

  1.  函数执行到 第 8 行(res = function(4))时候执行 function 函数并传入参数 4
  2.  判断 4 是否等于 1 返回值为假 执行第 5 行
  3.  s = 4 + function(3) 调用函数 function 并传入参数 3
    1. 判断 3 是否等于 1 返回值为假执行第 5 行
    2. s = 3+function(2)调用函数 function 并传入参数 2
      1. 判断 2 是否等于 1 返回值为假执行第 5 行
      2. s = 2+function(1)调用函数 function 并传入参数 1
        1. 判断 1 是否等于 1 返回值为真执行 return 1 给调用者
      3. s = 2 + 1 然后执行 return s (s=3)给调用者
    3. s = 3 + 3 然后执行return s (s=6)给调用者
  4.  s = 4 + 6 然后执行return s (s=10)给调用者
  5.  res = 10
  6.  print(10)
  7.  函数结束。

   输出:

10

  同理:当把n传入100时会得到结果5050


  7.lambda表达式(匿名函数):

  除了 def 语句用来定义函数之外,还可以使用匿名函数 lambda ,它是Python一种生成函数对象的表达式形式。匿名函数通常是创建了可以被调用的函数,它返回了函数,而并没有将这个函数命名。lambda有时被叫做匿名函数也就是这个原因,需要一个函数,又不想动脑筋去想名字,这就是匿名函数。

  lambda函数的语法只包含一个语句,如下:   

  

lambda arg1,arg2,.....argn : expression

  lambda表达式没有 返回值 表达式本身就是一个返回值

def func(a, b, c):
    return a + b + c
print(func(1, 2, 3))
# 返回值为6
# lambda匿名函数
f = lambda a, b, c: a + b + c
print(f(1, 2, 3))
# 返回结果为6

 注:

  冒号:之前的a,b,c表示它们是这个函数的参数。
  匿名函数不需要 return 来返回值,表达式本身结果就是返回值。


  8.高阶函数:

    以下两个条件满足其一就叫做高阶函数:

    • 函数的返回值返回值是一个函数名。
    • 函数的传入参数是一个函数名。

  


二、全局变量与局部变量

  全局变量:作用域在全局的变量叫做全局变量,该变量在一个程序内的任何地方都可以被访问。(不在任何代码块内)

  局部变量:仅仅在代码块(函数)内可用,其他地方不能读取和使用。

  如果局部变量与全局变量重名:

    • 若无 global 关键字默认访问局部变量。
v = "123"
def function():

    v = "456"   #此处创建了新的变量(局部变量)
    print(v)

function()
print(v)

    输出:

456
123
    • 若有 global 关键字则访问全局变量。
v = "123"
def function():
    global v
    v = "456"   #此处修改了全局变量
    print(v)

function()
print(v)

    输出:

456
456

如果全局变量是个列表或字典等可变类型变量:可以对内部元素进行操作。

v = [1, 2, 3, "test"]
def function():
    v[1] = "aaa"
    v.append(555)
    print(v)

function()
print(v)

  

  输出:

[1, 'aaa', 3, 'test', 555]
[1, 'aaa', 3, 'test', 555]

  但是:

v = [1, 2, 3, "test"]
def function():
    v = "aaa"       #相当于创建了一个新的变量v
    print(v)

function()
print(v)

  输出:

aaa
[1, 2, 3, 'test']

   如果是嵌套的函数:

v = "aaa"
def function():
    v = "bbb"       # 相当于创建了一个新的变量v
    print(v)
    def inner_function():
        v = "ccc"
        print(v)
    inner_function()
    print(v)
function()
print(v)

  

  输出:

bbb
ccc
bbb
aaa

  如果 inner_function 想调用 function 的局部变量 v 需要使用 nonlocal 关键字

v = "aaa"
def function():
    v = "bbb"       # 相当于创建了一个新的变量v
    print(v)
    def inner_function():
        nonlocal v  # 不创建新的变量 使用上一级函数的局部变量v
        v = "ccc"
        print(v)
    inner_function()
    print(v)
function()
print(v)

  输出:

bbb
ccc
ccc
aaa

  总结:

    当全局变量与局部变量重名时优先读取局部变量,能读取全局变量,无法对全局变量重新赋值
    但是对于可变类型,可以对内部元素进行操作
    如果函数中有 global 关键字,变量本质上就是全局的那个变量,可读取可赋值

不成文规定:全局变量全部使用大写字母表示。

  

原文地址:https://www.cnblogs.com/zbuter/p/8711186.html