Python基础学习(四)
菜鸟咀嚼python基础之继续。
一、返回函数
第三章已经简单操作了Python的高阶函数,目前继续练手函数作为返回值的特效;通常,高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回。
案例:通常我们写一个求和的函数会这样写
#通常我们写一个求和的函数会这样写
def get_sum(*param):
count = 0;
for item in param:
count = count + item
return count print( get_sum(1,2,3,4) )
输出: 10
#但是,如果不去求和,而是在后面的代码根据需要在计算可以吗,可以的。它可以不用返回求和结果,而是返回求和函数。
def last_sum(*param):
def sum():
num = 0
for n in param:
num = num + n
return num
return sum fun = last_sum(1,2,3,4)
print( fun )
print( fun() )
输出结果:
<function last_sum.<locals>.sum at 0x7f4a2d3b58c8>
10
说明:由此可见单纯的输出返回的函数是没有结果的,只有调用返回的函数,才能将求和打印出来
另外,如果多次调用 last_sum 函数,每次返回的都是一个新的函数,即使传入相同的参数;
例如:
fun1 = last_sum(1,2,3,4)
fun2 = last_sum(1,2,3,4) print( fun1 == fun2 )
返回:False
说明:fun1() 和 fun2() 的调用互不影响
闭包
def count():
fs = []
for i in range(1,4):
def f():
return i * i
fs.append( f )
return fs f1, f2, f3 = count() print( f1() )
print( f2() )
print( f3() )
输出:9,9,9
说明:这是因为当一个函数返回了一个函数后,i 这个内部局部变量还被新的函数引用,等到三个函数都返回时,函数 i 已经比变成3了,所以执行的 函数输出 9, 9, 9
注意:返回函数不要引用任何循环变量,或者后续会发生变化的变量
可以这样写:
def count2():
def f(i):
def g():
return i * i
return g
fs = []
for i in range(1,4):
fs.append( f(i) )
return fs f11, f22, f33 = count2() print( f11() )
print( f22() )
print( f33() )
返回结果:1,4,9
说明:方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
也就是说当我们必须要调用循环变量的时候,需要多加一个局部函数,在每次执行 循环变量 i 的时候 去调用那个新的函数并将 i 作为它的一个参数 达到立刻被执行,则 i 无论后期怎么变都不会受到影响。
二、匿名函数
匿名函数就是没有名字的函数,有些时候为了简洁方便可以不去定义函数,而是直接使用匿名函数,案例:
#匿名函数
mylist = list( map(lambda y:y*y, [1,2,3,4]) )
print( mylist )
输出:[1, 4, 9, 16]
说明:匿名函数 lambda y:y*y 其实就是匿名函数,用 lambda 去表示一个匿名函数,第一个 y 代表匿名函数的参数,冒号后面是匿名体,可以表示函数处理的功能。
匿名函数就是一个表达式,不用写returen 返回值就是表达式结果,同时,匿名函数还可以是一个变量,例如:
#匿名函数-变量
mytest = lambda y:y*y
mylist = list( map( mytest , [1,2,3,4]) )
print( mylist )
输出:[1, 4, 9, 16] 效果同上;
三、装饰器
其实函数就是一个对象。而且函数对象可以被赋值给变量,所以,通过变量也就相当于调用了那个函数。
例如:
def myFun(a):
return a*a test = myFun print( test(5) )
输出:25
其实函数有一个__name__的属性,可以验证出他真正的函数是谁。例如:
print( test.__name__ )
输出:myFun
四、偏函数
Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial Function)例如:int()它可以将一个字符串转换为整数,其实它还可以指定转换的类型,默认的十进制的,其实可以指定进制转换;
例如:
print( int('123') )
print( int('123', base=8) )
print( int('11111', base=2) )
print( int('123', base=16) )
print( int('123', base=10) )
输出:
123
83
31
291
123
说明:base= 就是制定转换进制的入口;
案例2:
def intTest2( x, base = 2):
return int( x, base) print( intTest('100000') )
输出:32
案例3:functools.partial 就是帮助创建一个偏函数,这样就不需要自定义 intTest2(),
例如:
import functools intTest2 = functools.partial(int, base=2) print( intTest2('10000000') )
输出:128
说明:functools.partial 的作用就是把一个函数的某些参数设定一个默认值,在重新返回一个新的函数,这样更方便调用一个新的函数。
Python基础学习(四)的更多相关文章
- Python基础学习四
Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...
- 【Python基础学习四】字符串(string)
Python 字符串 字符串是 Python 中最常用的数据类型.可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'hello' va ...
- Python基础学习四 列表、元组、字典、集合
列表list,用中括号“[ ]”表示 1.任意对象的有序集合 列表是一组任意类型的值,按照一定顺序组合而成的 2.通过偏移读取 组成列表的值叫做元素(Elements).每一个元素被标识一个索引,第一 ...
- Python基础学习四 函数
1.内置函数 Python内置了很多有用的函数,是可以直接调用的. 参考链接:https://docs.python.org/3/library/functions.html 调用函数的时候,如果传入 ...
- Python基础学习四 文件操作(二)
####读取文件#### with open('goods_info.txt', 'r', encoding='utf-8') as f: f.seek(0) # 注意指针位置 goods_info ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Day1 Python基础学习
一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...
- Day1 Python基础学习——概述、基本数据类型、流程控制
一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...
- Python 基础学习 总结篇
Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
随机推荐
- StackOverflow 问题
StackOverflow 这个问题一般是你的程序里头可能是有死循环或递归调用所产生的:可以查看一下你的程序,也可以增大你JVM的内存~~~在Eclipse中JDK的配置中加上 -XX:MaxD ...
- throws和throw抛出异常的使用规则
一直对java中的throws和throw不太理解.最近一直在查这两个方面的资料,算是能明白一点吧.如果我下面的观点哪有不对,希望指出来,我加以改进. throw:(针对对象的做法) ...
- js和JQuery区别
this.class="btn-default btn-info"; $(this).toggleClass("btn-default btn-info"); ...
- shell脚本--cut命令与awk简单使用
cut:对内容进行列切割 -d 后面的是分割符,表示用什么符号来分割符来分割列,分隔符使用引号括起来: -f后面跟着要选择的字段列,从1开始,表示第一列,如果要多列,可以用逗号分隔 : -c参数后面跟 ...
- Memcached分布式缓存快速入门
一.从单机到分布式 走向分布式第一步就是解决:多台机器共享登录信息的问题. •例如:现在有三台机器组成了一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器共享登录状态? •解决1:Asp ...
- [转帖]Nginx 的 TCP 负载均衡介绍
Nginx 的 TCP 负载均衡介绍 https://www.cnblogs.com/felixzh/ 前几天同事问 nginx的代理 当时以为只有http的 现在看起来还有tcp的可以使用tcp 代 ...
- JS文件的写入
1.引入filesaver.js插件: 2.JS: 方法一:var file = new File(["欢迎访问 hangge.com"], "文件导出测试.txt&qu ...
- 关于flask 上直接使用py.test测试框架进行测试
这个周末基本上都在研究这玩意儿中度过了,虽然效率不高,英文文档看得晕头转向,但是好歹弄出来了 有个结果测试也通过了现在粗略总结一下有时间补上更多详细的例子. 首先使用py.test测试框架,可以做最简 ...
- 《ERP系统原理与实施》
第一 采购 第二 生产(生产任务->生产准备->加工单->派工单->生产调度->生产监控->数据采集->统计分析) 第三 仓储 第四 质量 第五 财务 第六 ...
- 黑客又多一款喜爱工具:知名 Windows Phone 破解工具 WPinternals 开源了
导读 Windows Phone 发布后,黑客 HeathCliff74(René Lergner)写了一个软件 WPinternals,利用它可以对 Windows Phone 进行破解,这使他成为 ...