• Python中的函数(二)


    一 局部变量与全局变量

    在子程序中定义的变量为局部变量,在程序一开始定义的变量为全局变量。

    全局变量作用域为整个程序,局部变量作用域为定义该变量的子程序。

    当局部变量与全局变量同名时,在定义局部变量的子程序内是局部变量起作用,在其他地方全局变量起作用。

    函数内无声明变量时,用的是全局变量:

     1 name = "abc"
     2 def change_name1():
     3     print(name)
     4 
     5 def change_name2():
     6     name = "123"
     7     print(name)
     8 
     9 change_name1()
    10 change_name2()
    输出:
    abc
    123

    如果函数内容无global关键字,优先读取局部变量,无法对全局变量赋值。

    当要子程序调用全局变量,并修改全局变量时在子程序变量前加 global :

     1 name = "abc"
     2 
     3 def change_name():
     4     global name
     5     name = "123"
     6     print(name)
     7 
     8 print(name)
     9 change_name()
    10 print(name)
    输出:
    abc
    123
    123

     nonlocal的用法:

    在嵌套函数中使用,想调用上一级函数的变量并修改时,要在本函数开头用nonlocal声明想要调用的变量

     1 def change_name1():
     2     name = "abc"
     3     print(name)
     4     def chang_name2():
     5         nonlocal name
     6         name = "123"
     7         print(name)
     8     chang_name2()
     9     print(name)
    10 
    11 
    12 change_name1()
    输出:
    abc
    123
    123

    前向引用----->>>>"函数即变量":在调用这个函数前如果没有定义该函数则会报错。

    函数内部的嵌套函数只能该函数直接调用,其他函数无法直接调用该函数。

    二 函数的递归

    在函数内部,可以调用其它函数。如果一个函数在其内部调用它自己,这个函数就是递归函数。

    1 def count(n):
    2     print(n)
    3     if n > 0:
    4         count(n-1)
    5     return 0
    6 
    7 count(5)
    输出:
    5
    4
    3
    2
    1
    0

    递归特性:

    • 必须要有一个明确的结束条件,否则就成了死循环
    • 每次进入更深一层递归时,问题规模都应该相比于上一次要少
    • 递归的执行效率不高,递归层次过多会导致栈溢出。

    引用网上找的图片

     三 匿名函数

    匿名函数就是不需要显示的指定函数。

    1 #一般函数
    2 def count(n):
    3     return n+1
    4 print(count(10))
    5 
    6 #换成的匿名函数
    7 count = lambda x:x+1
    8 print(count(10))

    匿名函数主要和其他函数一起用。

    四 函数式编程

    高阶函数,满足下面条件至一:

    1. 函数的传入参数是一个函数名
    2. 函数的返回值是一个函数

    map:

    #map函数 map(fun,num)  fun:函数;num:可迭代对象
    1
    num = [1,2,3,5,6,9,8] 2 def map_test(fun,num_l): 3 res = [] 4 for i in num_l: 5 re = fun(i) 6 res.append(re) 7 return res 8 9 print(map_test(lambda x:x-1,num)) 10 #map生成的是一个可迭代对象 11 print("内置map函数",list(map(lambda x:x-1,num)))
    输出:
    [0, 1, 2, 4, 5, 8, 7]
    [0, 1, 2, 4, 5, 8, 7]

    filter:

     1 n_people = ["1sb","2","3sb","4"]
     2 
     3 def filter_test(fun,str_l):
     4     res = []
     5     for i in str_l:
     6         if fun(i):
     7             res.append(i)
     8     return res
     9 
    10 print(filter_test(lambda n:n.endswith("sb"),n_people))
    11 #filter 函数,生成的是一个可迭代对象
    12 print("filter生成的是:",filter(lambda n:n.endswith("sb"),n_people))
    13 print(list(filter(lambda n:n.endswith("sb"),n_people)))
    输出:
    ['1sb', '3sb']
    filter生成的是: <filter object at 0x0000020FFB28C2E8>
    ['1sb', '3sb']

    reduce:

     1 num_l = [1, 2, 3, 4, 5, 6]
     2 
     3 def reduce_test(func, num , init=None):
     4     if init == None:
     5         str_l = num.copy()
     6         res = str_l.pop(0)
     7     else:
     8         res = init
     9     for i in str_l:
    10         res = func(res, i)
    11     return res
    12 
    13 print(reduce_test(lambda x,y:x+y,num_l))
    14 print(reduce_test(lambda x,y:x*y,num_l))
    15 
    16 from functools import reduce
    17 print("reduce生成的是:",reduce(lambda x,y:x+y,num_l))
    18 print("reduce生成的是:",reduce(lambda x,y:x*y,num_l))
    输出:
    21
    720
    reduce生成的是: 21
    reduce生成的是: 720
  • 相关阅读:
    链表 2.4
    链表 2.3
    链表 2.2
    链表 2.1
    数组与字符串 1.8
    数组与字符串 1.7
    数组与字符串 1.6
    CounterBreach安装测试的全部过程
    数据库管理软件 Navicat Premium12 破解步骤
    webgote的例子(6)SQL注入(盲注)
  • 原文地址:https://www.cnblogs.com/kaixindexiaocao/p/9696534.html
Copyright © 2020-2023  润新知