Python 必须了解的5种高级特征


Posted in Python onSeptember 10, 2020

Python 是一种美丽的语言,它简单易用却非常强大。但你真的会用 Python 的所有功能吗?

任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目,并在 stackoverflow 上寻找某个问题的答案。然后你突然发现了一个非常优雅的解决方案,它使用了你从不知道的 Python 功能!

这种学习方式太有趣了:通过探索,偶然发现什么。

下面是 Python 的 5 种高级特征,以及它们的用法。

Lambda 函数

Lambda 函数是一种比较小的匿名函数——匿名是指它实际上没有函数名。

Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda 函数,我们根本没为它命名。这是因为 lambda 函数的功能是执行某种简单的表达式或运算,而无需完全定义函数。

lambda 函数可以使用任意数量的参数,但表达式只能有一个。

x = lambda a, b : a * b
print(x(5, 6)) # prints '30'

x = lambda a : a*3 + 3
print(x(3)) # prints '12'

看它多么简单!我们执行了一些简单的数学运算,而无需定义整个函数。这是 Python 的众多特征之一,这些特征使它成为一种干净、简单的编程语言。

Map 函数

Map() 是一种内置的 Python 函数,它可以将函数应用于各种数据结构中的元素,如列表或字典。对于这种运算来说,这是一种非常干净而且可读的执行方式。

def square_it_func(a):
 return a * a

x = map(square_it_func, [1, 4, 7])
print(x) # prints '[1, 16, 49]'

def multiplier_func(a, b):
 return a * b

x = map(multiplier_func, [1, 4, 7], [2, 5, 8])
print(x) # prints '[2, 20, 56]'看看上面的示例!我们可以将函数应用于单个或多个列表。实际上,你可以使用任何 Python 函数作为 map 函数的输入,只要它与你正在操作的序列元素是兼容的。

Filter 函数

filter 内置函数与 map 函数非常相似,它也将函数应用于序列结构(列表、元组、字典)。二者的关键区别在于 filter() 将只返回应用函数返回 True 的元素。

详情请看如下示例:

# Our numbers
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

# Function that filters out all numbers which are odd
def filter_odd_numbers(num):

 if num % 2 == 0:
  return True
 else:
  return False

filtered_numbers = filter(filter_odd_numbers, numbers)

print(filtered_numbers)
# filtered_numbers = [2, 4, 6, 8, 10, 12, 14]

我们不仅评估了每个列表元素的 True 或 False,filter() 函数还确保只返回匹配为 True 的元素。非常便于处理检查表达式和构建返回列表这两步。

Itertools 模块

Python 的 Itertools 模块是处理迭代器的工具集合。迭代器是一种可以在 for 循环语句(包括列表、元组和字典)中使用的数据类型。

使用 Itertools 模块中的函数让你可以执行很多迭代器操作,这些操作通常需要多行函数和复杂的列表理解。关于 Itertools 的神奇之处,请看以下示例:

from itertools import *

# Easy joining of two lists into a list of tuples
for i in izip([1, 2, 3], ['a', 'b', 'c']):
 print i
# ('a', 1)
# ('b', 2)
# ('c', 3)

# The count() function returns an interator that 
# produces consecutive integers, forever. This 
# one is great for adding indices next to your list 
# elements for readability and convenience
for i in izip(count(1), ['Bob', 'Emily', 'Joe']):
 print i
# (1, 'Bob')
# (2, 'Emily')
# (3, 'Joe') 

# The dropwhile() function returns an iterator that returns 
# all the elements of the input which come after a certain 
# condition becomes false for the first time. 
def check_for_drop(x):
 print 'Checking: ', x
 return (x > 5)

for i in dropwhile(should_drop, [2, 4, 6, 8, 10, 12]):
 print 'Result: ', i

# Checking: 2
# Checking: 4
# Result: 6
# Result: 8
# Result: 10
# Result: 12


# The groupby() function is great for retrieving bunches
# of iterator elements which are the same or have similar 
# properties

a = sorted([1, 2, 1, 3, 2, 1, 2, 3, 4, 5])
for key, value in groupby(a):
 print(key, value), end=' ')

# (1, [1, 1, 1])
# (2, [2, 2, 2]) 
# (3, [3, 3]) 
# (4, [4]) 
# (5, [5])

Generator 函数

Generator 函数是一个类似迭代器的函数,即它也可以用在 for 循环语句中。这大大简化了你的代码,而且相比简单的 for 循环,它节省了很多内存。

比如,我们想把 1 到 1000 的所有数字相加,以下代码块的第一部分向你展示了如何使用 for 循环来进行这一计算。

如果列表很小,比如 1000 行,计算所需的内存还行。但如果列表巨长,比如十亿浮点数,这样做就会出现问题了。使用这种 for 循环,内存中将出现大量列表,但不是每个人都有无限的 RAM 来存储这么多东西的。Python 中的 range() 函数也是这么干的,它在内存中构建列表。

代码中第二部分展示了使用 Python generator 函数对数字列表求和。generator 函数创建元素,并只在必要时将其存储在内存中,即一次一个。这意味着,如果你要创建十亿浮点数,你只能一次一个地把它们存储在内存中!Python 2.x 中的 xrange() 函数就是使用 generator 来构建列表。

上述例子说明:如果你想为一个很大的范围生成列表,那么就需要使用 generator 函数。如果你的内存有限,比如使用移动设备或边缘计算,使用这一方法尤其重要。

也就是说,如果你想对列表进行多次迭代,并且它足够小,可以放进内存,那最好使用 for 循环或 Python 2.x 中的 range 函数。因为 generator 函数和 xrange 函数将会在你每次访问它们时生成新的列表值,而 Python 2.x range 函数是静态的列表,而且整数已经置于内存中,以便快速访问。

# (1) Using a for loopv
numbers = list()

for i in range(1000):
 numbers.append(i+1)

total = sum(numbers)

# (2) Using a generator
 def generate_numbers(n):
  num, numbers = 1, []
  while num < n:
   numbers.append(num)
  num += 1
  return numbers
 total = sum(generate_numbers(1000))

 # (3) range() vs xrange()
 total = sum(range(1000 + 1))
 total = sum(xrange(1000 + 1))

以上就是Python 必须了解的5种高级特征的详细内容,更多关于python 高级特征的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python深入06——python的内存管理详解
Dec 07 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
详解Python核心对象类型字符串
Feb 11 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
python中dict使用方法详解
Jul 17 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
Feb 17 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
python动态规划算法实例详解
Nov 22 Python
Python如何配置环境变量详解
May 18 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 #Python
利用python 读写csv文件
Sep 10 #Python
如何用Python 加密文件
Sep 10 #Python
Python 高效编程技巧分享
Sep 10 #Python
python操作redis数据库的三种方法
Sep 10 #Python
Python计算矩阵的和积的实例详解
Sep 10 #Python
python如何运行js语句
Sep 09 #Python
You might like
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
3分钟学会一个Python小技巧
2018/11/23 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
python中sys模块是做什么用的
2020/08/16 Python
python基于openpyxl生成excel文件
2020/12/23 Python
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
干部行政关系介绍信
2014/01/17 职场文书
消防安全标语
2014/06/07 职场文书
谢师宴答谢词
2015/01/05 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
高一地理教学工作总结
2015/08/12 职场文书
田径运动会广播稿
2015/08/19 职场文书
销售口号霸气押韵
2015/12/24 职场文书
创业计划书之冷饮店
2019/09/27 职场文书