python视频教程栏目介绍Python列表推导式的使用。
相关免费学习推荐:python视频教程
Python 列表推导式并不是给初学者用的,因为它非常反直觉,甚至对于有其他编程语言背景的人也是如此。
我们接触到 List 的使用时,学习的内容都是零散的。所以我们缺少一个关于如何在各种各样的场景下使用 List 的知识体系。
本文提供了一些 List 的使用指南,尽可能涵盖各个方面。希望本文可以成为你的一站式实用手册。
使用建议
1.建议使用迭代的方式
使用 List 最基本的方式是以一个可迭代对象为基础,创建一个 List 对象,这个可迭代对象可以是任意可以迭代元素的Python对象。使用方法如下。
[expression for item in iterable]
下面这段代码展示了一个使用列表相关技术创建 List 对象的例子。在这个例子中,我们定义了一个 Integer 列表,并基于这个对象创建了保存每个数字的平方数和立方数的 List 对象。
>>> # 创建一个 Integer 列表 >>> integers = [1, 2, 3, 4, 5, 6] >>> # 创建平方数和立方数列表 >>> powers = [(x*x, pow(x, 3)) for x in integers] >>> print(powers) [(1, 1), (4, 8), (9, 27), (16, 64), (25, 125), (36, 216)]
上面的例子把 List 对象当作迭代器使用。我们应该知道,许多类型的对象也是可迭代的,比如 List、Set、Dictionary 和 String 等等。其他数据类型,像 range、map、filter,以及 pandas 包中的 Series、DataFrame,都是可迭代的。下面的代码演示了某些对象的使用方法。
>>> # 使用 range 对象 >>> integer_range = range(5) >>> [x*x for x in integer_range] [0, 1, 4, 9, 16] >>> # 使用 Series 对象 >>> import pandas as pd >>> pd_series = pd.Series(range(5)) >>> print(pd_series) 0 0 1 1 2 2 3 3 4 4 dtype: int64 >>> [x*x for x in pd_series] [0, 1, 4, 9, 16]
2.如果只需用到其中的某些元素,应当使用条件判断语句
假设你需要将符合某种条件的元素归集起来,并创建一个 list。下面展示了相关的语法。
[expression for item in iterable if condition]
if 语句用来实现条件判断。下面的代码展示了这种用法的一个简单示例。
>>> # 同样创建一个 Integer 列表 >>> integers = [1, 2, 3, 4, 5, 6] >>> # 筛选出偶数,创建一个这些偶数的平方数列表 >>> squares_of_evens = [x*x for x in integers if x % 2 == 0] >>> print((squares_of_evens)) [4, 16, 36]
3.使用条件判断语句
List 对象中还可以使用 if-else 形式的条件判断,语法如下。
[expression0 if condition else expression1 for item in iterable]
这跟前面的那种用法有些类似,别把这两种用法混淆。在本例中,条件语句本身是一个整体。下面的代码提供了一个例子。
>>> # 创建一个 Integer 列表 >>> integers = [1, 2, 3, 4, 5, 6] >>> # 遍历 integers 中的元素,如果是偶数,取平方数存入新的列表 >>> # 如果是奇数,取立方数存入新的列表 >>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers] >>> print(custom_powers) [1, 4, 27, 16, 125, 36]
4.如果有嵌套结构,可以使用嵌套的循环
有可能可迭代对象中的元素自身也是可迭代的,尽管这种情况不太常见。如果你对嵌套的可迭代对象有兴趣,可以使用 for 来实现循环嵌套。语法如下。
[expression for item_outer in iterable for item_inner in item_outer] # 与下面的代码等同 for item_outer in iterable: for item_inner in item_outer: expression
上面的代码展示了使用for实现嵌套循环的例子。
>>> # 创建一个包含元组的列表 >>> prices = [('$5.99', '$4.99'), ('$3.5', '$4.5')] >>> # 获取元组中的每个价格,以此创建一个一维列表 >>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group] >>> print(prices_formatted) [5.99, 4.99, 3.5, 4.5]
5.替换高阶函数
有的人比较习惯函数式编程,比如使用高阶函数也是这种习惯的表现之一。特别说明一下,高阶函数是那些需要使用输入或输出参数的函数。在 Python 中,常用的高阶函数有 map() 和 filter()。
>>> # 创建一个 integer 类型的列表 >>> integers = [1, 2, 3, 4, 5] >>> # 使用 map 创建平方数列表 >>> squares_mapped = list(map(lambda x: x*x, integers)) >>> squares_mapped [1, 4, 9, 16, 25] >>> # 使用列表推导式创建平方数列表 >>> squares_listcomp = [x*x for x in integers] >>> squares_listcomp [1, 4, 9, 16, 25] >>> # 使用 filter 取得 integers 中的偶数列表 >>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers)) >>> filtered_filter [2, 4] >>> # 使用列表推导式取得 integers 中的偶数列表 >>> filterd_listcomp = [x for x in integers if x % 2 == 0] >>> filterd_listcomp [2, 4]
从上面的例子可以看出,使用 list 的某些特性比使用高阶函数更具有可读性,而且也能实现较复杂的嵌套结构。
1.不要忘了定义构造函数
有人认为列表推导式很酷炫,是 Python 特有的功能,所以为了炫耀自己的 Python 水平,即使有更好替代方案也要使用它。
>>> # 使用 range 创建列表对象 >>> numbers = [x for x in range(5)] >>> print(numbers) [0, 1, 2, 3, 4] >>> # 以一个字符串为基础,创建一个小写字母的字符列表 >>> letters = [x.lower() for x in 'Smith'] >>> print(letters) ['s', 'm', 'i', 't', 'h']
上述例子中,我们使用了 range 和 string,这两种数据结构都是可迭代的,list()构造函数可以直接使用 iterable 创建一个 list 对象。下面的代码提供了更合理的解决方案。
>>> # 使用 range 创建列表对象 >>> numbers = list(range(5)) >>> print(numbers) [0, 1, 2, 3, 4] >>> # 以一个字符串为基础,创建一个小写字母的字符列表 >>> letters = list('Smith'.lower()) >>> print(letters) ['s', 'm', 'i', 't', 'h']
2.不要忘了生成器表达式
在 Python 中,生成器是一种特殊的可迭代对象,它会延迟加载元素,直到被请求才会加载。这在处理大量数据时会非常高效,它能提升存储效率。相比之下,list 对象为了方便计数和索引,一次性创建所有的元素。所以跟生成器相比,在元素个数相同时,list 需要占用更多内存。
我们可以定义一个生成器函数来创建生成器。我们也可以使用下面的语句来创建生成器,这是一种称为生成器表达式的方法。
(expression for item in iterable)
你可能会注意到,除了使用圆括号外,它的语法跟使用 list 的语句很相似。所以需要注意区分。
考虑下面这个例子。我们要计算前一百万个数字的平方和。如果使用 list 来实现,方法如下。
>>> # 创建列表对象 squares >>> squares = [x*x for x in range(10_000_000)] >>> # 计算它们的总和 >>> sum(squares) 333333283333335000000 >>> squares.__sizeof__() 81528032
如上所示,list 对象占据 81528032 字节。我们考虑使用 generator 进行相同的操作,代码如下。 >>> # 创建 generator 对象,保存每个数的平方数 >>> squares_gen = (x*x for x in range(10_000_000)) >>> # 计算它们的总和 >>> sum(squares_gen) 333333283333335000000 >>> squares_gen.__sizeof__() 96
跟使用 list 相比,使用 generator 内存开销小得多,只有 96 字节。原因很简单———— generator 不需要获取所有的元素。相反,它只需要获取各个元素在序列中的位置,创建下一个元素并呈现它,而且不必保存在内存中。
结论
本文中,我们整理了 list 应用的一些关键要领。这些该做的和不该做的都非常清晰明了。我估计你会在合适的场景中用到它。下面是本文内容的小结。
使用迭代的方式。 Python 中有許多類型的 iterable,你應該在掌握基礎(list 和 tuple)的同時融會貫通。
使用條件判斷語句。 如果你對在 iterable 中篩選某些元素感興趣,可以多研究條件判斷。
使用條件判斷表達式。 如果你需要有選擇性地取得某些數據,可以使用條件判斷表達式。
使用巢狀的循環。 如果你要處理巢狀的 iterable,可以使用巢狀的循環結構。
用 list 取代高階函數在很多情況下,可以用 list 取代高階函數。
不要忘記 list 的建構子定義 list 的建構函數,可以使用 iterable 建立一個 list 物件。如果你直接使用 iterable,推薦用這個方法。
不要忘了生成器表達式它的語法與 list 中的語法相似。在處理大量的物件時,這是一種節省記憶體開銷的方法。 list 和 generator 不同的是,為了日後的索引和訪問, list 必須提前創建,如果元素個數很多,就會消耗很大的內存。
以上是Python 清單推導式使用的注意事項的詳細內容。更多資訊請關注PHP中文網其他相關文章!

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器