Python组合数据类型笔记

小白笔记
仅记录常规操作中较为不熟悉的操作类型

1、list(str)/str.split():列表中的元素为字符类型

>>> s='1,3,6,9,2,5,1'
>>> s=list(s)
>>> s

# ['1',',','3',',','6',',','9',',','2',',','5',',','1']

>>> s='1,2,3,4' 
>>> s=s.split(',') 
>>> s 

# ['1','2','3','4']

2、对于数字字符串要转换为列表类型,需要加eval函数,非数字字符串不可用否则会报错

>>> s='1,3,6,9,2,5,1'
>>> s=list(eval(s))
>>> s

# [1, 3, 6, 9, 2, 5, 1]

>>> s='a,b,c'
>>> c=list(eval(s))

Traceback (most recent call last):
  File "", line 1, in 
    c=list(eval(s))
  File "", line 1, in 
NameError: name 'a' is not defined

3、对于列表定义,非数字元素需要加引号,否则会报错

>>> f=[a,b,c]

Traceback (most recent call last):
  File "", line 1, in 
    f=[a,b,c]
NameError: name 'a' is not defined

>>> f=[1,2,3]
>>> f

# [1, 2, 3]

注:列表类型可以使用 "+" 来为列表增加元素,可见如下杨辉三角的生成器实例:

def triangles():
    L = [1]
    while 1:
        yield L
        L = [0] + L + [0]
        L = [L[i] + L[i + 1] for i in range(len(L) - 1)]

4、关于字典定义,其中非数字元素必须为字符串形式(即:必须有引号),键值都是

>>> d = {china:beijing,usa:newyork}

Traceback (most recent call last):
  File "", line 1, in 
    d = {china:beijing,usa:newyork}
NameError: name 'china' is not defined

>>> d = {'a':2,'b':3}
>>> d

# {'a': 2, 'b': 3}

5、字典中:k in d 仅用于判断某一键 k 是否在字典 d 中

6、ls.remove(x) 将列表ls中出现的第一个元素x删除,不会生产新的列表,是对原列表进行修改

7、d.get(k, ) 用来返回字典 d 中的 k 键对应的值,如果不存在 k 键则返回

8、d.pop(k, )用来删除字典 d 中 k 键及对应的值,如果不存在 k 键则返回

>>> d = {'中国':'北京','美国':'华盛顿','法国':'巴黎'}
>>> d.get('中国','罗马')

# '北京'

>>> d.get('慕尼黑','罗马')

# '罗马'

>>> d.pop('中国','罗马')

# '北京'

>>> d.pop('慕尼黑','罗马')

# '罗马'

>>> d

# {'美国': '华盛顿', '法国': '巴黎'}

9、列表生成式
列表生成式就是一个用来生成列表的特定语法形式的表达式,它是一种语法糖。

语法糖是指计算机语言中,某些特定功能用一种简洁方便的语法实现,以代替常规语法(比如电话中的快速拨号:用“长按1” 来呼叫特定联系人,以替代拨打完整的电话号码)

基础语法格式

[exp for iter_var in iterable]

工作过程:

迭代iterable中的每个元素; # iterable:迭代对象
每次迭代先把结果赋给iter_var,后通过exp得到一个新值; # exp:表达式
最后把所有通过exp得到的计算值以一个新列表的形式返回。

相当于这样的过程:

L = []
for iter_var in iterable:
    L.append(exp)

实例:生成一个2n+1的数字列表,n为从3到11的数字

list1 = [2*n + 1 for n in range(3, 11)]

带过滤功能语法格式

[exp for iter_var in iterable if_exp]

工作过程:

迭代iterable中的每个元素,每次迭代都先判断if_exp表达式结果为真,如果为真则进行下一步,如果为假则进行下一次迭代;
把迭代结果赋值给iter_var,然后通过exp得到一个新的计算值;
最后把所有通过exp得到的计算值以一个新列表的形式返回。

相当于这样的过程:

L = []
for iter_var in iterable:
    if_exp:
        L.append(exp)

实例:过滤出一个指定的数字列表中值大于20的元素

L = [3, 7, 11, 14,19, 33, 26, 57, 99]
list2 = [x for x in L if x > 20]

循环嵌套语法格式

[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

工作过程:

每迭代iterable_A中的一个元素,就把ierable_B中的所有元素都迭代一遍。

相当于这样的过程:

L = []
for iter_var_A in iterable_A:
    for iter_var_B in iterable_B:
        L.append(exp)

实例:计算两个集合的全排列,并将结果作为保存至一个新的列表中

L1 = ['香蕉', '苹果', '橙子']
L2 = ['可乐', '牛奶']
list3 = [(x, y) for x in L1 for y in L2]

10、生成器
按照某种算法不断生成新的数据,直到满足某一个指定的条件结束
构造生成器的两种方式:

  • 使用类似列表生成式的方式生成
(2*n + 1 for n in range(3, 11))   # 把列表生成式中的 [] 改为 () 即可
  • 使用包含yield的函数来生成
    实例:
def my_range(start, end):
    for n in range(start, end):
        yield 2*n + 1  # 生成器函数,在执行时遇到yield的时候,函数返回(中断),只有下次调用时才会继续执行后续语句(从上次中断的位置继续)
        print('测试执行过程')

g1 = my_range(3, 6)

利用next() 函数来遍历生成器(可以用for循环遍历)
第一次遍历

print(next(g1))

结果是:

7

第二次遍历

print(next(g1))

结果是:

测试执行过程
9

需要说明的是:如果生成器函数有返回值,要获取该返回值的话,只能通过在一个while循环中不断的next(),最后通过捕获StopIteration异常

参考链接:
https://www.cnblogs.com/yyds/p/6281453.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128

你可能感兴趣的:(Python组合数据类型笔记)