欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python 函数

程序员文章站 2022-03-20 20:00:46
在python中,变量没有类型,一个对象的引用,类型属于对象变量的本质上是一个占位符!通常用小写字母命名变量。 函数式编程 一:语法 def 函数名(参数列表): 函数体 (函数名命名一般用小写字母 + 单下划线数字等组合)二:常用函数的类型 (1)带参数的函数:参数须以正确的顺序传入函数 (2)默 ......


在python中,变量没有类型,一个对象的引用,类型属于对象
变量的本质上是一个占位符!通常用小写字母命名变量。
    -----------------------------------------函数式编程------------------
一:语法

    def 函数名(参数列表):
        函数体
    (函数名命名一般用小写字母 + 单下划线数字等组合)
二:常用函数的类型

    (1)带参数的函数:参数须以正确的顺序传入函数
    (2)默认参数函数:未传递参数,则会使用默认参数,默认参数不在最后,会报错!
    (3)关键字参数:函数调用使用关键字参数来确定传入的参数值
    (4)不定长参数:函数能处理比当初声明时更多的参数,
    
        ①*args中所有的变量都会被包装成一个元组存放所有未命名的变量
        ②**args中所有变量都会被包装成一个字典

    (5)声明函数时,参数中星号 * 可以单独出现,*之后的的参数必须用关键字传入

    (6)匿名函数,使用lambda函数创建匿名函数

        ①lambda 只是一个表达式,函数体比 def 简单很多
        ②lambda的主体是一个表达式,而不是一个代码块
        ③函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

三:python 函数的参数传递:

    不可变类型:

    类似 c++ 的值传递,如 int、string、tuple。
    如fun(a),传递的只是a的值,没有影响a对象本身。
    比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身.

    可变类型:

    类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,        
    修改后fun外部的la也会受影响

    python 中一切都是对象,严格意义我们不能说值传递还是引用传递,
    我们应该说传不可变对象和传可变对象

四:变量作用域
    
    python 中的作用域一般有四种:
    l (local) 局部作用域
    e (enclosing) 闭包函数外的函数中
    g (global) 全局作用域
    b (built-in) 内建作用域
查找规则是l->e->g->b

    python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,
其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说
这些语句内定义的变量,外部也可以访问。

五:全局变量与局部变量

    定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

    当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
    (1)global用来修改全局变量的值
    (2)nonlocal要修改嵌套作用域(enclosing 作用域,外层非全局作用域)
    中的变量则需要 nonlocal 关键字了

六:函数调用中的技巧(重要)

    函数名.__doc__获取函数的帮助文档
    函数名可以作为另一个函数的形参
    多个返回值以元组的方式返回

    内部函数,不修改全局变量可以访问全局变量!!
    内部函数,修改同名全局变量,则python会认为它是一个局部变量!!
    

七:关于命名

    (1)文件名:全小写,可以使用下划线
    (2)函数名:小写,小驼峰原则
    (3)变量名:全部小写,下划线连接
    详细的命名规则参考pep8

八:几个特殊的函数(跟老乔学python)
    ------------函数式编程------------------
    lambda
    map
    reduce
    filter
    ------------暂留------------------

  1 # --------------------------------------------------------------------------#
  2 # 函数的语法及调用
  3 # --------------------------------------------------------------------------#
  4 
  5 
  6 def func(func_name, number):        # 函数的定义
  7     """打印输入的任何字符串"""
  8     print(func_name, number)
  9     return 'done'
 10 
 11 
 12 func('func_1', 'faith')             # 函数的调用
 13 
 14 # --------------------------------------------------------------------------#
 15 # 不定长参数函数,封装成元组
 16 # --------------------------------------------------------------------------#
 17 
 18 
 19 def func_1(func_name, *number):
 20     """
 21     打印输入的任何字符串
 22     """
 23     print(type(number))
 24     print(func_name, number)
 25     return 'done'
 26 
 27 
 28 func_1('func_1', 1, 2, 2, 3)
 29 
 30 
 31 def func_2(func_name, number):   #
 32     print(type(number))
 33     print(func_name, number)
 34     return 'done'
 35 
 36 
 37 func_2('func_2', (1, 2, 2, 3))
 38 
 39 
 40 def func_3(func_name, *number):
 41     print(func_name)
 42     print(number[3])            # 根据元组index中一部分变量
 43     print(number[4])
 44     return 'done'
 45 
 46 
 47 func_3('func_3', 1, 2, 2, 3, 'aaa', 'abc')
 48 
 49 
 50 # get out question: the number of index isn't known in most case!
 51 # --------------------------------------------------------------------------#
 52 # 不定长参数函数,封装成字典
 53 # --------------------------------------------------------------------------#
 54 
 55 
 56 def func_4(func_name, **number):  # 可变参数必须在函数参数的最后
 57     # print(type(number))
 58     print(func_name, number)
 59     return 'done'
 60 
 61 
 62 func_4('func_4', name='faith')
 63 
 64 # --------------------------------------------------------------------------#
 65 # 命名关键字函数
 66 # --------------------------------------------------------------------------#
 67 
 68 
 69 def func_5(a, x, c, *, china, uk):
 70     print('func_5:', china, uk)
 71     print(a, x, c)
 72 
 73 
 74 func_5(1, 2, 3, china='bj', uk='rs')    # 调用时必须加上关键字
 75 # func_5(1, 2, 3, 'bj', 'rs')
 76 
 77 # --------------------------------------------------------------------------#
 78 # 函数应用之-递归
 79 # --------------------------------------------------------------------------#
 80 
 81 
 82 def my_sum(i):
 83     if i < 0:
 84         raise valueerror    # 抛出错误
 85     elif i <= 1:
 86         return i
 87     else:
 88         return i + my_sum(i - 1)
 89 
 90 
 91 print(my_sum(1.4))
 92 
 93 # --------------------------------------------------------------------------#
 94 # 传递不可变对象实例
 95 # --------------------------------------------------------------------------#
 96 
 97 
 98 def change_int(a):
 99     a = 10
100 
101 
102 b = 2
103 change_int(b)
104 print(b)         # 结果是2
105 # --------------------------------------------------------------------------#
106 # 传递可变对象实例
107 # --------------------------------------------------------------------------#
108 
109 
110 def change_me(mylist):
111     mylist.append([1, 2, 3, 4])
112     print("函数内取值: ", mylist)
113     return
114 
115 
116 mylist = [10, 20, 30]
117 change_me(mylist)
118 print("函数外取值: ", mylist)
119 
120 # --------------------------------------------------------------------------#
121 # 函数内修改全局变量的值
122 # --------------------------------------------------------------------------#
123 
124 money = 200  # 模块里面的全局变量
125 
126 
127 def add_money():
128     global money
129     money = money + 1
130     return money
131 
132 
133 print("修改后的值money = ", add_money())
134 
135 
136 # --------------------------------------------------------------------------#
137 # 匿名函数
138 # --------------------------------------------------------------------------#
139 sum_1 = lambda arg1, arg2: arg1 + arg2
140 
141 # 调用sum函数
142 print("相加后的值为 : ", sum_1(10, 20))
143 print("相加后的值为 : ", sum_1(20, 20))
144 
145 # 单独编译一个文件时候输出结果
146 if __name__ == "__main__":
147     pass