12.Python基础语法---“组”总结与补充

03Python中表示“组”的概念与定义.png

这里如下几方面的补充说明

  1. 关于切片步长参数
  2. 列表与字典推导式、元组推导式
  3. 解包操作

关于切片步长参数

语法:list[start:end:step]
s[i:j:k]

  1. 如果 i 或 j 为负值,则索引顺序是相对于序列 s 的末尾: 索引号会被替换为 len(s) + i 或 len(s) + j。 但要注意 -0 仍然为 0。
    备注:后续的说明都基于这个规则先替换为正值后套用。

  2. s 从 i 到 j 的切片被定义为所有满足 i <= k < j 的索引号 k 的项组成的序列。 如果 i 或 j 大于 len(s),则使用 len(s)。 如果 i 被省略或为 None,则使用 0。 如果 j 被省略或为 None,则使用 len(s)。 如果 i 大于等于 j,则切片为空。

  3. s 从 i 到 j 步长为 k 的切片被定义为索引号 x = i + nk (n满足 0 <= n < (j-i)/k) 的所有项组成的序列。 换句话说,索引号为 i, i+k, i+2k, i+3*k,以此类推,当达到 j 时停止 (但一定不包括 j)。
    当 k 为正值时,如果i 和 j 大于len(s), 将被替代为len(s)。
    当 k 为负值时,如果i 和 j 大于len(s) - 1,将被替代为len(s) -1。
    如果 i 或 j 被省略或为 None,它们会成为“终止”值 (是哪一端的终止值则取决于 k 的符号)。 请注意,k 不可为零。 如果 k 为 None,则当作 1 处理。

规律总结:
若step>0,表示是从左向右进行切片;此时,start值必须小于end值才会有结果,否者为空;
若step<0,表示是从右向左进行切片;此时,start值必须大于end值才会有结果,否者为空;
上述说明中start,end为同符号
list[::-1]表示从右向左以步长为1进行切片
list[::2]表示从左向右以步长为2进行切片

# 正步长
print("*" * 23)
str_give = '123456789'
print(str_give[::])
# i=None, j=None ==> i=0, j=9 
# 123456789
print(str_give[2:7:])
# i=2, j=7
# 34567
print(str_give[-7:-2:])
# i=-7,j=-2;len(s)=9 ==> 索引替换:i=len(s)+i=2, j=len(s)+j=7
# 34567
print(str_give[2::])
# i=2, j=None ==> i=2, j=9
# 3456789
print(str_give[-7::])
# i=-7, j=None ==> 索引替换:i=len(s)+i=2, j=9
# 3456789
print(str_give[:7:])
# i=None, j=7 ==> i=0,j=7
# 1234567
print(str_give[:-2:])
# i=None, j=-2 ==>i=0,索引替换:j=len(s)+j=7  
# 1234567

# 负步长
print("*" * 23)
print(str_give[::-1])
# 987654321
print(str_give[6:1:-1])
# i=6, j=1, k=-1 ==> 0<= n <5 ==>[6,5,4,3,2]
# 76543
print(str_give[-3:-8:-1])
# len(s) = 9  同str_give[6:1:-1]
# 76543
print(str_give[6::-1])
# 7654321
print(str_give[-3::-1])
# len(s) = 9  同str_give[6::-1]
# 7654321
print(str_give[:1:-1])
# 9876543
print(str_give[:-8:-1])
# len(s) = 9  同str_give[:1:-1]
# 9876543
print(str_give[8::-1])
# 987654321
print(str_give[-1::-1])
# len(s) = 9  同str_give[8::-1]
# 987654321

str_give = '123456789'
s1 = [str_give[i] for i in range(8, 5, -1)]
print(s1)
#['9', '8', '7']
print(str_give[-3:])
# 789
print(str_give[:5:-1])
987

备注://TODO
在步长为负数时,i或j有一个省略或两个都省略的情况下,尝试去套用公式,但无法确定i和j的默认取值规则,所以这两种情况下暂时公式还是无法匹配,需要进一步尝试公式套用方式。

列表与字典推导式、元组推导式

# 列表推导式
# 从1 到 10  所有偶数的平方
alist = []
for i in range(1,11):
    if (i % 2 == 0):
        alist.append( i*i )
print(alist)

blist = [i*i for i in range(1, 11) if(i % 2) == 0]
print(type(blist))
print(blist)

执行结果:
[4, 16, 36, 64, 100]
<class 'list'>
[4, 16, 36, 64, 100]

# 字典推导式
# 100以内被3整除的数的平方
adict = {}
for i in range(1,100):
    if (i % 3 == 0):
        adict[i] = i * i
print(adict)

bdict = {i:i*i for i in range(1, 100) if (i % 3) == 0}
print(type(bdict))
print(bdict)

执行结果:
{3: 9, 6: 36, 9: 81, 12: 144, 15: 225, 18: 324, 21: 441, 24: 576, 27: 729, 30: 900, 33: 1089, 36: 1296, 39: 1521, 42: 1764, 45: 2025, 48: 2304, 51: 2601, 54: 2916, 57: 3249, 60: 3600, 63: 3969, 66:
4356, 69: 4761, 72: 5184, 75: 5625, 78: 6084, 81: 6561, 84: 7056, 87: 7569, 90: 8100, 93: 8649, 96: 9216, 99: 9801}
<class 'dict'>
{3: 9, 6: 36, 9: 81, 12: 144, 15: 225, 18: 324, 21: 441, 24: 576, 27: 729, 30: 900, 33: 1089, 36: 1296, 39: 1521, 42: 1764, 45: 2025, 48: 2304, 51: 2601, 54: 2916, 57: 3249, 60: 3600, 63: 3969, 66:
4356, 69: 4761, 72: 5184, 75: 5625, 78: 6084, 81: 6561, 84: 7056, 87: 7569, 90: 8100, 93: 8649, 96: 9216, 99: 9801}

# 元组推导式 
# 元组只能被初始化不能被动态赋值
# atuple = ()
# for i in range(1,11):
#     if (i % 2 == 0):
#         atuple.append( i*i )
# print(atuple)

# 返回的是一个生成器
btuple = (i*i for i in range(1, 11) if(i % 2) == 0)
print(type(btuple))
print(tuple(btuple))

执行结果:
<class 'generator'>
(4, 16, 36, 64, 100)

关于解包操作

在Python中有一种非常简便的实现方法:
序列解包
假设有字符串:aString = ‘abcd’,
将字符串同时赋予四个变量,既:x1, x2, x3, x4 = aString
那么 x1 就是字符串的第一个元素,x3 就是第三个元素,对序列类型都可以生效的

还有一种情况要在编程中考虑到,如果字符串中的元素比较多的时候,如:aString = ‘abcdefg’
不需要定义更多的变量来一一对应元素个数,可以使用 *(星号)来匹配,同样取出第一个和第三个元素,使用
x1, x2, x3, *x4 = aString # 注意x4变量前面的星号
使用x1, x3 变量依然可以取出第一个和第三个元素

解包操作同样支持集合与字典
需要特别说明的是字典解包出来的Key

a_string = 'abcd'
x1, x2, x3, x4 = a_string
print(x1)
print(x2)
print(x3)
print(x4)

执行结果:
a
b
c
d

a_string = 'abcdefg'
x1, x2, x3, x4, *x5 = a_string
print(x1)
print(x2)
print(x3)
print(x4)
print(*x5)
# print('*x5 type:{}'.format(type(*x5)))
# # Traceback (most recent call last):
# #   File "02group.py", line 1245, in <module>
# #     print('*x5 type:{}'.format(type(*x5)))
# # TypeError: type.__new__() argument 2 must be tuple, not str
print(x5)
print('x5 type:{}'.format(type(x5)))

执行结果:
a
b
c
d
e f g
['e', 'f', 'g']
x5 type:<class 'list'>

a_list = [1,2,3,4,5]
x1,x2,x3,*x4 = a_list
print(x1)
print(x2)
print(x3)
print(*x4)
print(x4)

执行结果:
1
2
3
4 5
[4, 5]

a_tuple = (1,2,3,23,24)
x1,x2,x3,*x4 = a_tuple
print(x1)
print(x2)
print(x3)
print(*x4)
print(x4)

执行结果:
1
2
3
23 24
[23, 24]

a_set = {1,2,3,12,6}
x1,x2,x3,*x4 = a_set
print(x1)
print(x2)
print(x3)
print(*x4)
print(x4)

执行结果:
1
2
3
6 12
[6, 12]

a_dict = {1:10,2:20,3:30,4:40,5:50}
x1,x2,x3,*x4  = a_dict
print(x1)
print(x2)
print(x3)
print(*x4)
print(x4)

执行结果:
1
2
3
4 5
[4, 5]

参考
互联网相关资料
Python官方文档
Python sequence-types-list-tuple-range

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容