字符和字节的区别:
字符就是看到的组成对象的最小元素,比如‘中国’ 中 就是一个字符,国 也是一个字符;
字节是一个单位,八位表示一个字节;
想查看某些方法源码:
比如想查看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类型~