美文网首页Python基础
12.Python基础语法---“组”总结与补充

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

作者: 浪子大侠 | 来源:发表于2020-04-04 22:26 被阅读0次
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

相关文章

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

    这里如下几方面的补充说明 关于切片步长参数 列表与字典推导式、元组推导式 解包操作 关于切片步长参数 语法:lis...

  • 基础语法(补充)

    基础语法整理 声明内部型(TYPES) 声明变量 声明常量 (CONSTANTS) 声明结构 参考SE11里...

  • python学习总结

    python基础语法总结 参考:Python基础语法总结 参考:1.Python标识符 在 Python 里,标识...

  • 基础语法点(补充)

    声明结构: 参考se11里存在的structure 参考自定义型(TYPES) 给结构域体赋值 MOVE-...

  • 快速上⼿ Kotlin

    快速上⼿ Kotlin 基础语法 函数基础语法 与 Java 代码互调 Java 与 Kotlin 交互的语法变化...

  • Kotlin基础语法<二>

    学习需要一步步进行,前面已学习过了部分kotlin基础语法。基础语法的学习与总结会让我对...

  • 2019-02-11

    MarkDown 基础语法总结 各种header,比如# ,## ,###等等,=====,------多级标题...

  • 日记5月16日

    已经进入了深夜,听着脸红的歌曲,单曲一直在循环。 今天基本什么也没做,把基础3的语法总结完了,完后补充了一觉。下午...

  • 12.Python基础数据类型总结

    Python基础数据类型总结 按照存储空间从低到高排序数字字符串集合(无序,即无索引相关信息)元组(有序,需要存储...

  • 基础语法总结

    1.c++ .c/.mm 2013 OC第三 2.c语言字符串,使用字符数组构成,或者指针,清空指针NULL, 0...

网友评论

    本文标题:12.Python基础语法---“组”总结与补充

    本文链接:https://www.haomeiwen.com/subject/ximryhtx.html