这篇文章是我关于学习python函数的一些总结

一、随着函数的引入,这里首先要说的就是全局变量和局部变量了。

什么是全局变量、什么是局部变量:

全局变量就是全局都能调用的变量,一般都在文件的开头,顶头写。

局部变量就是在函数内定义的变量,其实这里不完全对,因为有一个关键字可以改变这一属性,就是global,如果局部变量的前面加入global声明的话,那么这个局部变量就变成了全局变量。

下面来看一个例子:

name = "全局变量"

def test():
name = "局部变量"
print(name) def test1():
global name
name = "我现在变成了全局变量了"
print(name) test()
test1() ######输出结果######
局部变量
我现在变成了全局变量了
 a

二、函数的作用域  

函数的作用域,这里要理解,或者说要记住的就是:

函数的作用域在定义函数的时候就已经固定,不会随着调用的位置改变而改变。

下面来看个例子:

name = "我是全局变量"
def one_level():
name = "我是第一层变量"
def two_level():
name = "我是第二层变量"
def three_level():
print(name)
return three_level
return two_level test = one_level()
test()()

上面的例子将会打印“我是第二层变量”,

这个例子告诉我们,函数体内有变量取值的操作的时候,一定是从里到外的原则的。首先会在当前的函数体内找有没有这个函数的定义值,如果没有,就会在往上一层的函数找,就这样层层的找,直到找到为止。

 三、递归函数

如果一个函数内部调用自身本身,这个函数就是递归函数

从字面意义上来理解就是消息的“传递”和“归来”。这样看来就是数据有一个去和回来的过程,

举个旅游的例子:

假如我在深圳,我要坐火车去北京旅游,中间由近及远的停靠站分别是:深圳-->南昌-->天津-->北京,列车整个过程有很多各站。

那我买了往返票,终点就是我要中断这次旅程的条件。流程就是这样的:在深圳上车-->经过南昌-->经过天津-->最后到北京。回来就是反之。

如果用代码实现的话,如下:

train_station = ['shenzhen','nanchang','tianjing','beijing','heilongjiang','xinjiang']

def journey(train_station):
station = train_station.pop(0)
if station == "beijing":
print("到了北京了,我们玩了一天,坐火车回家。")
return
else:
print("现在才到%s,还要继续坐火车。" % station)
res = journey(train_station)
print("现在返程,经过的停靠站是%s" % station)
return res journey(train_station)

输出结果是:

现在才到shenzhen,还要继续坐火车。
现在才到nanchang,还要继续坐火车。
现在才到tianjing,还要继续坐火车。
到了北京了,我们玩了一天,坐火车回家。
现在返程,经过的停靠站是tianjing
现在返程,经过的停靠站是nanchang
现在返程,经过的停靠站是shenzhen

递归函数的总结:

1、递归函数必须要有一个结束条件,否则就死循环了。

2、每次进入下一次递归,就越接近目标。

3、递归层次过多会导致栈溢出,(就如坐火车旅游,去到越远的地方,你的时间越长,人就会越累。)

尾递归优化:

还是以上面的例子举例、假如你很牛逼,能让火车在经过的站点不停留直接就走,时间是不是就会少很多。

体现在代码上面的话就是把赋值操作拿掉“res = journey(train_station)”。直接return journey(train_station)”。

递归函数没有赋值操作了,在内存中就不需要增加栈帧信息了。

四、匿名函数

匿名函数就是没有名字的函数,语法结构如下:

lambda 变量:运算

#一般的函数运算
def test(x):
x = x +1
return x
print(test(5)) #lambda函数
a = lambda x:x+1
print(a(5)) 以上两种、结果是一样的。

一般来说,匿名函数不会想上面的例子一样使用,是配合其他函数使用的,例如map、reduce、filter

下面结合map、reduce、filter、max、min函数来一起举例子:

from functools import reduce   #注意,如果是python3.0以上版本的话需要导入一下

#map结合lambda例子
a_list = [1,4,7,12,22] a_new_list = list(map(lambda x:x*2,a_list))
print(a_new_list) #reduce结合lambda例子1
b_list = [4,10,4,5] b_new_list = reduce(lambda x,y:x+y,b_list)
print(b_new_list) #reduce结合lambda例子2
b_list = [4,10,4,5] b_new_list = reduce(lambda x,y:x+y,b_list,100)
print(b_new_list) #filter结合lambda例子
c_list = ['aaa_fc','bbb_fc','ccc_fc','ddd','eee'] c_new_list = list(filter(lambda x:x.endswith('fc'),c_list))
print(list)

#max结合lambda例子
m_dict2 = [{'name':'beijing','people':10000000},{'name':'tianjing','people':9000000},{'name':'nanchang','people':5000000}]

print(max(m_dict2,key=lambda x:x['people']))
#mix结合lambda例子
print(min(m_dict2,key=lambda x:x['people']))
#######输出结果########### 
[2, 8, 14, 24, 44]
23
123
['aaa_fc', 'bbb_fc', 'ccc_fc']
{'name': 'tianjing', 'people': 10000000}}
{'name': 'tianjing', 'people': 5000000}

总结:

map函数:处理序列中的每一个元素,得到的结果是一个列表,该列表元素位置和原来一样

reduce函数:处理一个序列,然后把序列进行合并操作

filter函数:遍历序列中的每一个元素,判断每个元素得到的布尔值,如果为True就留下,返回的也是一个列表。

max函数:遍历序列中的每一个元素,取最大值

min函数:遍历序列中的每一个元素,取最小值

五、高阶函数

高阶函数的特征:

1、传入的参数是函数名

2、函数的返回值是函数名

六、内置函数

abs() :取绝对值

all(): 判断可迭代对象的元素是否存在,为空、none,0。

any(): 判断可迭代对象中是否包含空元素,包含则返回false,不包含返回True

bin(): 转换为二进制的方法

bool():转换为布尔值

bytes(): 转换成字节

callable(): 检查对象object是否可调用。

chr(): 返回证书i对应的ascll字符。与ord()作用相反

>>> chr(97)
'a'

compile():

complex():

divmod() : 返回的是a//b(除法取整)以及a对b的余数,返回结果类型为tuple元组

enumerate() :遍历序列中的元素以及他们的下标

m_dict2 = [{'name':'beijing','people':10000000},{'name':'tianjing','people':9000000},{'name':'nanchang','people':5000000}]
print(list(enumerate(m_dict2)))
打印:
[(0, {'name': 'beijing', 'people': 10000000}), (1, {'name': 'tianjing', 'people': 9000000}), (2, {'name': 'nanchang', 'people': 5000000})]

eval() :将字符串当成有效的表达式来求值并返回计算结果

frozenset() :传入一个对象,生成一个新的不可变的集合

hash():计算传入对象的哈希值

hex() :将10进制转换成16进制

id() :返回一个内存地址

isinstance():用来判断传入对象的数据类型。

issubclass()

iter()

locals():局部函数命名空间

memoryview() :返回对象obj的内存查看对象。

oct(): 十进制转换成八进制

ord(): 用来返回对应字符的ascii码

pow(): 下面的例子。就可以看出,如果传入两个参数就是计算次方,传入第三个参数的话就是取模

例子:

pow(4,2)

>>16

pow(4,2,2)

>>0

property():

repr():将传入的对象变成字符串

reversed() :取反,传入的可迭代对象,进过函数处理后得到一个反向的可迭代对象。

l=[3,4,5,6]

print(list(reversed(l)))

>>[6,5,4,3]

round() :返回浮点数的四舍五入值

set() :

slice():对传入的对象进行切片。

sum():求和

super()

vars() :函数以字典形式返回参数中每个成员的当前值,如果vars函数没有带参数,那么它会返回包含当前局部命名空间中所有成员的当前值的一个字典。

zip() :接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表

m_dict1 = {'a':'1111','b':'22222','c':'112','d':'5555'}

new_m_dict1 = list(zip(m_dict1.values(),m_dict1.keys()))
print(new_m_dict1)
>>[('1111', 'a'), ('22222', 'b'), ('112', 'c'), ('5555', 'd')]

python函数的学习笔记的更多相关文章

  1. Python函数参数学习笔记

    1.Python中函数参数类型可分为五种: f(x):x为位置参数: f(x,n=2):n为默认参数,调用时可以省略参数n,如f(5); f(*args):*args表示把args这个list或tup ...

  2. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  3. Python Built-in Function 学习笔记

    Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...

  4. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  5. python函数基础学习

    函数的定义与调用: def 函数名(参数1,参数2): ‘’’函数注释’’’ print(‘函数体’) return 返回值 定  义:def关键字开关,空格之后接函数名和圆括号,最后冒号结尾 def ...

  6. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  7. R语言函数化学习笔记3

    R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...

  8. Python快速入门学习笔记(二)

    注:本学习笔记参考了廖雪峰老师的Python学习教程,教程地址为:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb49318210 ...

  9. python数据分析入门学习笔记

    学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...

随机推荐

  1. (二)Linux——Linux常用指令

    1. 文件目录操作命令 ls 显示文件和目录列表     -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 mkdir 创建目录 -p 父目录不存在情况下先生成父目录 cd 切换目录 ...

  2. jQuery.Validate常用的一些规则

    // 手机号码验证 jQuery.validator.addMethod("mobile", function(value, element) { var length = val ...

  3. ucosii任务切换OS_TASK_SW()

    stm32F103中任务切换定义 //任务切换宏,由汇编实现. #define OS_TASK_SW() OSCtxSw() os_cpu_a.asm中任务切换函数的定义 NVIC_INT_CTRL ...

  4. 在Jboss中使用Quartz

    Jboss EJB默认使用的定时服务是TimerService,TimerService的使用过程较为繁琐,需要使用一个无状态的serviceBean去实现scheduleTimer, timeout ...

  5. awk按列求和

    awk 'BEGIN{total=0}{total+=$1}END{print total}'

  6. 获取CPU个数

    PROCESSER=`grep 'processor' /proc/cpuinfo | wc -l` JOBSS=$[$PROCESSER*2]

  7. hmtl表单

    表单: <form id="" name="" method="post/get" action="负责处理的服务端&quo ...

  8. IOS设计模式浅析之适配器模式(Adapter)

    引言 在项目开发中,有时候会遇到这样的一种情景:需要使用以前开发的“一些现存的对象”,但是新环境中要求的接口是这些现存对象所不满足的.怎样应对这种迁移的需求?使得可以复用这些对象,以满足新的应用环境, ...

  9. map--C++ STL 学习

    map–C++ STL 学习   Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力.   说下map内 ...

  10. MongoDb数据结构详解

    首先,向数据库插入一条bjson数据 首先是定义文档,然后使用admin用户名密码登录,进入test数据库,向test数据库中插入此文档(“表名称和表中的记录”) 插入结果,查看mongoVUE如下图 ...