python学习day04 for迭代中删除的问题,enumerate,range , is ==, 编码encode
for
msg = '老男孩python是全国范围内最好的python培训机构' for item in msg: #遍寻字符串 print(item) li = ['alex','银角','女神','egon','太白'] for i in li: #遍寻列表 print(i) #alex #银角 #女神 #egon #太白 dic = {'name':'太白','age':18,'sex':'man'} for k,v in dic.items(): #遍寻字典 print(k,v) #name 太白 #age 18 #sex man
else:的应用
if 条件: 代码块 elif 条件: 代码块 else: 条件不成立时执行 while 条件: 代码块 else: 条件不成立且代码块中无break执行 for index in li: #或者dic 或者字符串 或者range(range可以把他当做一个多少次的循环) 代码块 else: 循环执行完且代码块中无break执行
迭代本质上是对可迭代对象按索引或者key逐一进行操作的,当在迭代过程中首先获取可迭代对象的元素个数,并以此作为循环的次数,按照索引从0开始递增找到索引对应的元素,如果在迭代过程中对可迭代对象进行了删除,会导致索引的变化和元素的减少,当循环到删除后的可迭代对象没有循环的索引时就会停止循环,而且现在的索引与迭代开始时索引对应的元素不同,此时再进行操作很容易出错,所以解决的办法就是把循环次数和原数据索引分开,使用迭代删除时,首先把要删除的数据保存在一个新的列表(字典.字符串')中,然后迭代这个列表,在这个迭代中使用删除命令删除原数据中的元素
lst = ["倚天屠龙记", "诛仙", "看见", "追风筝的人"] for i in lst: del lst[0] print(lst) #['看见', '追风筝的人'] 因为当删除两个之后找不到索引2对应的元素了,所以for循环结束 ["看见","追风筝的人"]没有被删除 # 正确 for i in range(0, len(lst)): del lst[0] print(lst) for i in range(0, len(lst)): lst.pop() print(lst) # 把要删除的东西保存在一个新列表中,下面这个例子是清空操作(不使用clear) lst = ["倚天屠龙记", "诛仙", "看见", "追风筝的人"] new_lst = [] for el in lst: new_lst.append(el) # 循环新列表. 删除老列表 for e in new_lst: lst.remove(e) print(lst)
enumerate 枚举
#枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 li = ['alex','银角','女神','egon','太白'] for i in enumerate(li): print(i) #(0, 'alex') #(1, '银角') #(2, '女神') #(3, 'egon') #(4, '太白') for index, name in enumerate(li,100): # 起始位置默认是0,可更改 print(index, name) #100 alex #101 银角 #102 女神 #103 egon #104 太白
range 指定范围,生成指定数字
for i in range(1,10): #依次输出1-10 print(i) for i in range(1,10,2): # 步长 print(i) for i in range(10,1,-2): # 反向步长 print(i)
# *******************补充变量的存储地址*************** is 和 == 的区别 id(变量) 返回变量的内存地址 is 比较的是变量的内存地址 == 比较的是值 s="123" print(id(s)) #1714629420176 每次执行,内存地址得到的是不同的 小数据池(常量池): 把我们使用过的值存储在小数据池中.供其他的变量使用. 小数据池给数字和字符串使用, 其他数据类型不存在. 对于数字: -5~256是会被加到小数据池中的. 每次使用都是同一个对象. 对于字符串串: 1. 如果是纯数字信息和下划线. 那么这个对象会被添加到小数据池 2. 如果是带有特殊字符的. 那么不会被添加到小数据池. 每次都是新的 3. 如果是单个字母*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加 到小数据池中 注意(一般情况下): 在py⽂文件中. 如果你只是单纯的定义一个字符串. 那么一般情况下都是会 被添加到小数据池中的. 我们可以这样认为: 在使用字符串的时候, python会帮我们把字符串 进行缓存, 在下次使用的时候直接指向这个字符串即可. 可以节省很多内存.

存放变量名,可以把变量名理解为指针,里面可以存储变量内容的内存地址,变量名之间的直接赋值如V1=V2是内存地址的传递,变量内容赋值给变量名如V1="123",是在内存中开辟一个区域存储"123",同时将这个内存地址赋值给V1,使V1指向"123",当然变量在内存中开辟地址时使用的是小数据池还是其他位置,取决于变量的内容,详见上面小数据池的说明
#**********************编码及转化******************************* # ASCII 8bit 1byte 英文小写大写字母. 特殊字符. 数字 # GBK 16bit 2byte 中文 兼容ASCII # UNICODE 32bit 4byte 万国码. 占空间 浪费 # UTF-8 unicode升级版, 英文 1byte, 中文 3byte # # 传输过程中用: UTF-8或者GBK. UNICODE 浪费资源. # 内存中, 我们程序运行的过程中. 编码是unicode,所以程序在网络中运行时需要先转码再发送,在程序中.字符串可以编码成bytes类型的数据,使用编码encode()编码 # 转换的时候. GBK不能和UTF-8互相转换. s="你" print(s.encode("GBK")) #b'\xc4\xe3' print(s.encode("UTF-8")) # b'\xe4\xbd\xa0' 这就是把字符串编码成bytes类型的数据,b'表示是bytes类型,\x表示是16进制,中文使用UTF-8是3个字节 e4 bd a0就是这三个字节
print("nihao你好".encode("UTF-8"))
#b'nihao\xe4\xbd\xa0\xe5\xa5\xbd' 混合使用
#解码是decode print(s.encode("UTF-8").decode()) #你
英文的bytes: b'英文'不会再变成16进制码
浙公网安备 33010602011771号