python学习笔记day07 小结

字符和字节的区别:

字符就是看到的组成对象的最小元素,比如‘中国’ 中 就是一个字符,国 也是一个字符;

字节是一个单位,八位表示一个字节;

想查看某些方法源码:

比如想查看str的全部方法:

ctrl + B(或者ctrl + 鼠标左键) 可以查看对应的方法,不过如果方法很多,确实不太方便,可以按下面方式操作:

  ----->    -----> ------->勾上即可查看具体方法列表,双击可查看方法详细介绍;

字符串--不可变数据类型;列表:可变数据类型

之前一道题,判断一字符串连续数字的个数:

s='hskd123jk34d'
for i in s:
    print(i)
    if not i.isdigit():
        s=s.replace(i,' ')

    print(s.split(),len(s.split()))

运行会发现,print(i) 其实还是原来字符串s的每一个字符,虽然内部当原有字符串中的字符不是数字时已经用空格代替,并且循环赋给s了(注意这里的s其实已经是新的s了,虽然名字相同,因为字符串是不可变数据类型,不会改变原有的字符串,对字符串的任何操作都是产生新的字符串!!!)

运行结果:

F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py
h
s
k
d
1
2
3
j
k
3
4
d
['123', '34'] 2

每次print(i) 并不是逐渐被替换成的空格哦~

然后我们再来看可变数据类型list:

如果我们想要完成一个需求,循环删除list的元素:(下面这个写法是错误的~)

L=[1,2,3,4,5]
for i in range(len(L)):
    print(i,L)  # i还是原来的长度生成的
    del L[i]  #每次会删除一个元素,造成原有的L变化,长度就变了
print(L)

会报错:

F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py
Traceback (most recent call last):
  File "F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py", line 49, in <module>
    del L[i]  #每次回删除一个元素,造成原有的L变化,长度就变了
IndexError: list assignment index out of range
0 [1, 2, 3, 4, 5]
1 [2, 3, 4, 5]
2 [2, 4, 5]
3 [2, 4]

当i=3是已经删除了三个元素了,L还剩2个元素,i=3 所以会出现上面"IndexError: list assignment index out of range”的错误

str那样操作就可以,list会报错,根本原因是前者是不可变数据类型,对str的任何操作都是产生一个新的str并不会改变原有的str;

而list是可变数据类型,在循环过程中操作是会改变原有的list的!!

正确解法:

L=[1,2,3,4,5]
for i in range(len(L)):
    del L[-1]
    print(L)

运行结果:

F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py
[1, 2, 3, 4]
[1, 2, 3]
[1, 2]
[1]

 如果是要删除奇数位置的数:

L=[1,2,3,4,5]
for i in range(len(L)):
    del L[i]
    L.append(0)
print(L)

运行结果:

F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py
[2, 4, 0, 0, 0]

代表奇数位置的 1 3 5 已经删掉~

或者也可以:

L=[1,2,3,4,5]
del L[0::2]
print(L)

运行结果:

F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py
[2, 4]

 字典:

只要是在字典中循环,删除字典中的键值就会报错~

比如,如果想要实现如下需求: 删除字典中带有k的键:

dic={'k1':'v1','k2':'v2','a3':'v3'}
for i in dic:
    if 'k' in i:
        del dic[i]
print(dic)

运行结果:会报错

Traceback (most recent call last):
  File "F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py", line 58, in <module>
    for i in dic:
RuntimeError: dictionary changed size during iteration

只要是在list 或者dict中循环,然后删除list 或者dict中的元素都是会报错的,一定要谨慎!

可以这样做:

dic={'k1':'v1','k2':'v2','a3':'v3'}
dic1={}
for i in dic:
    if 'k' not in i:
        dic1.setdefault(i,dic[i])
dic=dic1
print(dic)

就是可以循环字典,但是不删除,而是再建一个字典,把不带k的键放到新字典中,就相当于把带k的键过滤掉啦~

或者可以新建一个list ,循环list 来删除字典中的某些键:

dic={'k1':'v1','k2':'v2','a3':'v3'}
L=[]
for i in dic:
    if 'k' in i:
        L.append(i)  #把带有k的键放到list中
for i in L:
    del dic[i]
print(dic)

运行结果:

F:workspace_pythonpycharm_projectsvenvScriptspython.exe F:/workspace_python/pycharm_projects/fullstack2018-08-17/week2/day04/01.py
{'a3': 'v3'}

元组

t=(1)
print(t,type(t))    #int
t2=(1,) 
print(t2,type(t2))  #tuple
t3=([1]) 
print(t3,type(t3))  #list
t4=([1],)
print(t4,type(t4)) #tuple

()中只有一个元素,且没有逗号时,该是什么类型就是什么类型;一个元素得加逗号才是tuple类型~

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9522903.html