![]() |
憨厚的鼠标垫 · CGAL的推进前表面重建-CSDN博客· 4 月前 · |
![]() |
怕老婆的水龙头 · SCENIC分析(四)_我们用scenic包 ...· 10 月前 · |
![]() |
要出家的台灯 · QML实现程序退出确认功能_qcoreapp ...· 1 年前 · |
![]() |
爱热闹的打火机 · 文件路径中放入斜杠引发的问题OSError: ...· 2 年前 · |
![]() |
文质彬彬的勺子 · 关于Windows服务下调用远程打印机的坑_ ...· 2 年前 · |
注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。
也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。
>>>
from
collections
import
deque
>>>
queue
=
deque
(
[
"Eric"
,
"John"
,
"Michael"
]
)
>>>
queue.
append
(
"Terry"
)
# Terry arrives
>>>
queue.
append
(
"Graham"
)
# Graham arrives
>>>
queue.
popleft
(
)
# The first to arrive now leaves
'Eric'
>>>
queue.
popleft
(
)
# The second to arrive now leaves
'John'
>>>
queue
# Remaining queue in order of arrival
deque
(
[
'Michael'
,
'Terry'
,
'Graham'
]
)
列表推导式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。 每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。
这里我们将列表中每个数值乘三,获得一个新的列表:
>>> vec = [ 2 , 4 , 6 ]现在我们玩一点小花样:
>>> [ [ x , x** 2 ] for x in vec ]我们可以用 if 子句作为过滤器:
>>> [ 3 *x for x in vec if x > 3 ]以下是一些关于循环和其它技巧的演示:
>>> vec1 = [ 2 , 4 , 6 ]
列表推导式可以使用复杂表达式或嵌套函数:
>>>
[
str
(
round
(
355
/
113
,
i
)
)
for
i
in
range
(
1
,
6
)
]
[
'3.1'
,
'3.14'
,
'3.142'
,
'3.1416'
,
'3.14159'
]
以下实例展示了3X4的矩阵列表:
>>> matrix = [以下实例将3X4的矩阵列表转换为4X3列表:
>>> [ [ row [ i ] for row in matrix ] for i in range ( 4 ) ]以上实例也可以使用以下方法来实现:
>>> transposed = [ ]另外一种实现方法:
>>> transposed = [ ]也可以用 del 删除实体变量:
>>> del a如你所见,元组在输出时总是有括号的,以便于正确表达嵌套结构。在输入时可能有或没有括号, 不过括号通常是必须的(如果元组是更大的表达式的一部分)。
集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。
可以用大括号({})创建集合。注意:如果要创建一个空集合,你必须用 set() 而不是 {} ;后者创建一个空的字典,下一节我们会介绍这个数据结构。
以下是一个简单的演示:
>>> basket = { 'apple' , 'orange' , 'apple' , 'pear' , 'orange' , 'banana' }集合也支持推导式:
>>> a = { x for x in 'abracadabra' if x not in 'abc' }另一个非常有用的 Python 内建数据类型是字典。
序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通常用字符串或数值。
理解字典的最佳方式是把它看做无序的键=>值对集合。在同一个字典之内,关键字必须是互不相同。
一对大括号创建一个空的字典:{}。
这是一个字典运用的简单例子:
>>> tel = { 'jack' : 4098 , 'sape' : 4139 }构造函数 dict() 直接从键值对元组列表中构建字典。如果有固定的模式,列表推导式指定特定的键值对:
>>> dict ( [ ( 'sape' , 4139 ) , ( 'guido' , 4127 ) , ( 'jack' , 4098 ) ] )此外,字典推导可以用来创建任意键和值的表达式词典:
>>> { x: x** 2 for x in ( 2 , 4 , 6 ) }如果关键字只是简单的字符串,使用关键字参数指定键值对有时候更方便:
>>> dict ( sape = 4139 , guido = 4127 , jack = 4098 )在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:
>>> for i , v in enumerate ( [ 'tic' , 'tac' , 'toe' ] ) :同时遍历两个或更多的序列,可以使用 zip() 组合:
>>> questions = [ 'name' , 'quest' , 'favorite color' ]要反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数:
>>> for i in reversed ( range ( 1 , 10 , 2 ) ) :要按顺序遍历一个序列,使用 sorted() 函数返回一个已排序的序列,并不修改原值:
>>> basket = [ 'apple' , 'orange' , 'apple' , 'pear' , 'orange' , 'banana' ]reinhard
mrl***[email protected]
。。。
928***[email protected]
小盟主
165***[email protected]
空白runoob
tia***[email protected]
教程中遍历 dict 使用的 .items() 方法配合 for 循环,非常简明易懂,但有一项需要注意的是,在 for 循环中,使用单个变量和双变量的区别,注意观察以下两个例子的区别:
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} >>> for k, v in knights.items(): ... print(k, v) gallahad the pure robin the brave
===========================分隔线===========================
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} >>> for k in knights.items(): ... print(k) ('gallahad', 'the pure') ('robin', 'the brave')
使用 k 和 v 两个变量时,将键与值分别赋予 k 和 v。使用 k 一个变量时,将对应的键与值作为一个整体赋给 k。所以,最终 print 的显示内容是有区别的。不只是此例,程序设计过程中有很多地方都会体现个体与整体的差异,虽然显示出来的结果非常相似,但逻辑上却是完全不同的。
Cxj
150***[email protected]
小闪闪
517***[email protected]
higandown
hig***[email protected]
Indecision
153***[email protected]
於黾
252***[email protected]
楼上很多人都在讨论推导式,这个东西在我看来是可有可无的,除了节省代码之外没什么用处,反而影响可读性(对于新手会不友好)
反而是另一个问题值得详细的说明: 元组的装包与拆包
先看下面的代码:
a,b=b,a print(a,b)我们都知道这样可以很方便的对2个值进行互换,然而这个操作其实涉及到元组的装包与拆包
完全的写法应该是下面这样的:
(a,b)=(b,a)
将a和b放入一个元组中,然后通过元组赋值
但是python会自动进行元组的装包与拆包操作,因此下面2个式子与上面是等价的:
a,b=(b,a) (a,b)=b,a理解了元组的自动装包拆包,再回头看函数的返回值,就可以更深入的理解了
函数其实并不能返回多个值,只能返回一个值。
当有多个返回值时,其实是自动将他们放入一个元组中,然后返回这个元组
def f(): return 1,2,3 print(f())
此时函数返回值其实是(1,2,3),是个元组
但是当我们用3个变量同时去接收这个返回值时a,b,c=f()
a,b,c=(1,2,3)
由于元组自动拆包,造成a=1,b=2,c=3,看似返回了多个值一样
如果不理解这一点,就会搞不清为什么有时候就有括号,有时候就没括号
关键有括号和没括号类型完全不一样,搞混了可是不行的
![]() |
憨厚的鼠标垫 · CGAL的推进前表面重建-CSDN博客 4 月前 |