第二章 函数编程

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

特性:

  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. mybatis从数据库中取数据且分组,返回分组数据

    mapper.xml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PU ...

  2. Fedora 安装及配置

    引言 最近学习课程要用到Linux,之前装的Ubuntu双系统被我删掉了(因为后来发现那个WSL,win子系统还挺好用的),所以上午用虚拟机再装了一下老师给的Ubuntu16,也不知道怎么回事特别卡, ...

  3. Java并发编程(一):线程基础知识以及synchronized关键字

    1.线程与多线程的概念:在一个程序中,能够独立运行的程序片段叫作“线程”(Thread).多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术. 2.多线程的意义:多线 ...

  4. ROS机器人话题之自定义消息

    ROS提供了丰富的内建消息,std_msgs包定义了一些基本的类型. 具体例子 首先定义一个消息类型的文件叫做Complex 例Complex.msg float32 real float32 ima ...

  5. 脚本实现统计osd内的pg数量

    脚本代码如下: ceph pg dump | awk ' /pg_stat/ { col=; while($col!=“up”) {col++}; col++ } /[-9a-f]+.[-9a-f]+ ...

  6. FFmpeg被声明为已否决的解决方案

    参考雷神的最简单的打印Hello World的程序: #include <stdio.h> #include <string.h> extern "C" { ...

  7. esp跟ebp跟踪记录

    发现文字描述还是太没有快感.上几幅图,来说明这个调试过程更好.此文对于深刻理解ebp,esp是具有长远意义的 可以看到,初始情况下,ebp此时值为0012FEDC,也就是栈帧的地址,而栈顶地址esp值 ...

  8. 一接口自动化中生成测试数据需要用到的java类API--import java.util.Properties;

    转载地址:    http://www.cnblogs.com/lay2017/p/8596871.html#undefined 写的很详细

  9. 在form子句中使用子查询时的注意事项

    今天中午为了弄清这个问题,本人真的是头都搞大了!最后明白了一点,在from子句中使用子查询是,一定要将临时表的别名带上,否则会灰常痛苦!!!

  10. SpringBoot2 整合Kafka组件,应用案例和流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.搭建Kafka环境 1.下载解压 -- 下载 wget http://mirror.bit.edu.cn/apache/kafka/2.2 ...