python_函数笔记

第二章 函数编程

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

  1. 减少重复代码

  2. 使程序变的可扩展

  3. 使程序变得易维护

形参变量

只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调 用结束返回主调用函数后则不能再使用该形参变量

实参

可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把 这些值传送给形参。因此应预先给实参赋值 

def count(x,y):  # x,y代表是形参
count(5,8)  # 5,8 代表实际的参数

位置参数

按参数的位置  来把形参和实参对应起来

关键参数

位置参数  >  关键参数 / 默认参数

非固定参数

在关键参数和默认参数后面 不知道后面会传入多少个值    args: 存成元组形式 kwargs :存成字典形式

局部变量and全局变量

局部变量:定义在函数内部的临时变量   只在函数内部有用  不影响全局变量 locals方法查找函数内部的所有变量  以字典的形式展现出来 globals方法查找全局的变量

全局变量:定义在程序的全局中  程序运行过程全局可调用      

  • 在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

  • 全局变量作用域(即有效范围)是整个程序,局部变量作用域是定义该变量的函数。

  • 变量的查找顺序是局部变量>全局变量

  • 当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。

  • 在函数里是不能直接修改全局变量的

匿名函数

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

#这段代码
def calc(x,y):
   return x**y
print(calc(2,5))
#换成匿名函数
calc = lambda x,y:x**y
print(calc(2,5))

匿名函数一般和其他函数一起使用

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
   print(i)

函数嵌套

在函数内部声明的函数 每个函数的变量是相互独立的且互不影响  嵌套的函数变量的查找规则是先当前层查找 在逐步依次往上查找

高阶函数

变量可以指向函数 ,函数的参数可以接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数就称为高阶函数。 一个函数只要满足下面两个的一个条件就称为高阶函数:

  1. 接受一个或则多个函数作为参数

  2.         return 返回另外一个函数

  3. 实例:

    def get_obs(n):
       if n < 0:
           n = int(str(n).strip('-'))
       return n
    def abb(x,y,z):
       return z(x) + z(y)
    res = abb(5,-8,get_obs)
    print(res)

     

递归函数

在函数内部可以调用其它函数,那么就可以调用其本身,这样调用其本身的函数就是递归函数

  1. 必须有一个明确的结束条件

  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

递归在特定场景下还是挺有用的,以后学的一些算法就得用到递归,比如堆排、快排等,现在看还是有些复杂的,以后再讲。

常用内置函数

名称 作用
dir 返回对象的可调用属性
divmod 返回除法的商和余数 ,比如divmod(4,2),结果(2, 0)
enumerate 返回列表的索引和元素,比如 d = [“alex”,”jack”],enumerate(d)后,得到(0, ‘alex’) (1, ‘jack’)
eval 可以把字符串形式的list,dict,set,tuple,再转换成其原有的数据类型。 #硬盘只认识字符串,数据类型是在内存中展示的
filter 对list、dict、set、tuple等可迭代对象进行过滤, filter(lambda x:x>10,[0,1,23,3,4,4,5,6,67,7])过滤出所有大于10的值
map map(lambda x:x**2,[1,2,3,43,45,5,6,]) 输出 [1, 4, 9, 1849, 2025, 25, 36]
frozenset 把一个集合变成不可修改的    #add给集合追加元素
globals 打印全局作用域里的值
reversed 可以把一个列表反转
round 可以把小数4舍5入成整数 ,round(10.15,1) 得10.2
sum 求和,a=[1, 4, 9, 1849, 2025, 25, 36],sum(a) 得3949
zip 以把2个或多个列表拼成一个, a=[1, 4, 9, 1849, 2025, 25, 36],b = [“a”,”b”,”c”,”d”], #拉链形式
center 字符串居中方法,第一个参数是宽度 ,第二参数个是填充符
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

闭包函数

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

名称空间

又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方

python里面有很多名字空间,每个地方都有自己的名字空间,互不干扰,不同空间中的两个相同名字的变量之间没有任何联系。

名称空间有4种:LEGB

  • locals:函数内部的名字空间,一般包括函数的局部变量以及形式参数

  • enclosing function:在嵌套函数中外部函数的名字空间, 若fun2嵌套在fun1里,对fun2来说,fun1的名字空间就enclosing.

  • globals:当前的模块空间,模块就是一些py文件。也就是说,globals()类似全局变量。

  • builtins: 内置模块空间,也就是内置变量或者内置函数的名字空间,print(dir(builtins))可查看包含的值。

不同变量的作用域不同就是由这个变量所在的名称空间决定的。

作用域即范围

  • 全局范围:全局存活,全局有效

  • 局部范围:临时存活,局部有效

查看作用域方法 globals(),locals()

''

 

猜你喜欢

转载自www.cnblogs.com/xiaolang666/p/11967855.html