第二章 函数编程

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

特性:

  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()

''

python_函数笔记的更多相关文章

  1. MySQL函数笔记

    MySQL函数笔记 日期函数 SELECT t1.xcjyrq, t1.* FROM view_sbxx t1 WHERE t1.syzt ; SELECT t1.xcjyrq, t1.* FROM ...

  2. JavaScript基础——JavaScript函数(笔记)

    avaScript 函数(笔记) JavaScript 是函数式编程语言,在JavaScript脚本中可以随处看到函数,函数构成了JavaScript源代码的主体. 一.定义函数 定义函数的方法有两种 ...

  3. STL之vector常用函数笔记

    STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...

  4. numpy函数笔记(持续更新)

    numpy函数笔记 np.isin用法 np.isin(a,b) 用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状和a一模一样的数组.(注意:这里的a ...

  5. Javascript进阶篇——(函数)笔记整理

    这节是根据慕课网和JavaScript DOM编程艺术一书加起来做的笔记 什么是函数如果需要多次使用同一段代码,可以把它们封装成一个函数.函数(function)就是一组允许在你的代码里随时调用的语句 ...

  6. Python_函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数

    函数的有用信息 代码1: def login(username, password): """ 此函数需要用户名,密码两个参数,完成的是登录的功能. :return: T ...

  7. Python_爬虫笔记_2018.3.19

    Python_爬虫_笔记 1.前言 1.1爬虫用途: 网站采集.接口采集(地图(jis 热力学 屋里端口/协议).微信.知乎.) 1.2基本流程:网页下载(requests)+网页解析+爬虫调度 网页 ...

  8. 学习Python函数笔记之二

    ---恢复内容开始--- 1.内置函数:取绝对值函数abs() 2.内置函数:取最大值max(),取最小值min() 3.内置函数:len()是获取序列的长度 4.内置函数:divmod(x,y),返 ...

  9. 学习python函数笔记之一

    1.函数文档字符串,用于存放函数的说明,一般写在第一行 2.函数调用:函数名+参数列表(函数的参数分实际参数和形式参数,str就是形式参数,则'welcome 头 python'就是实际参数) 参数需 ...

随机推荐

  1. spring源码系列博文总索引

    一 目录 准备 1 使用Gradle构建spring5源码的一些坑和步骤 IOC模块 1spring IOC接口设计分析 2 spring IOC容器实现类分析 3 spring IOC特定场景源码步 ...

  2. jdk和dubbo的SPI机制

    前言:开闭原则一直是软件开发领域中所追求的,开闭原则中的"开"是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的,“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代 ...

  3. Java支付宝PC网站支付功能开发(详细教程)

    一.前言 本案例使用的是Java实现的.使用支付宝的沙盒环境示例.发布需要换成正式环境.这里就不作详细说明了 本代码适合用来做参考,不要直接复制去使用. 没有账号的需要去平台注册一个: 登录支付宝开发 ...

  4. ORA-12547: TNS: 丢失连接

    今天服务器挂掉了,公司的人弄了一下,,把服务器修好了,,但是我本地链接数据库一直报这个ORA-12547: TNS: 丢失连接,是服务器上的TNS监听没有启动,需要重启一下,

  5. python学习记录(三)

    0827--https://www.cnblogs.com/fnng/archive/2013/02/24/2924283.html 通用序列操作 索引 序列中的所有元素都是有编号的--从0开始递增. ...

  6. Codeforces_821

    A.直接判断每一个数. #include<bits/stdc++.h> using namespace std; ][]; int main() { ios::sync_with_stdi ...

  7. java 利用POI 读取Execel数据的真实行数

    java 利用poi 读execel文件的操作,读取总的数据行数一般是通过调用 sheet.getLastRowNum() ;可是这样有时候会出现一些问题,例如,当其中一行的数据的确都为空,可是其原本 ...

  8. 第2章 Java并行程序基础(三)

    2.8 程序中的幽灵:隐蔽的错误 2.8.1 无提示的错误案例 以求两个整数的平均值为例.请看下面代码: int v1 = 1073741827; int v2 = 1431655768; Syste ...

  9. Go语言实现:【剑指offer】两个链表的第一个公共结点

    该题目来源于牛客网<剑指offer>专题. 输入两个链表,找出它们的第一个公共结点. Go语言实现: //长度长的先走个长度差,然后ab一起比较后面结点 //长度一样,公共结点可能在首结点 ...

  10. Property - 特性(Python)

    Property - Python 特性 不同的书籍对 property 一词的翻译有所不同, 我们将 property 翻译成 '特性' 以区别于 attribute 一词. 先看看 propert ...