跳转底部

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进制码
 

 

posted on 2018-06-02 10:59  afly666  阅读(385)  评论(0)    收藏  举报

导航

回到顶部