当while没有被关键字break主动结束的情况下,正常结束循环体代码之后会执行else的子代码
""" 语法 while 条件: 循环体代码 else: 循环体代码正常运行结束,则会执行该子代码块 """ count = 1 while count < 11: print(count) count += 1 else: print('循环全部执行完毕') # while循环在条件不满足时结束,此行代码会被运行
# 当while循环执行过程中被break中止时,就不会执行else的子代码块 count = 1 while count < 11: if count == 4: break # 当count的值为4时,while循环结束 print(count) count += 1 else: print('while循环没有被中止正常结束') # 此行代码不会被执行
死循环有些时候会极度影响电脑的性能,甚至会造成硬件的损坏
死循环就是永远无法结束的循环并且一直占用cpu工作
# 尤其是计算类的死循环会影响计算机的cpu count = 10 while True: count *= 1
# while嵌套(可使用全局标志位进行嵌套) flag = True # 1.定义初始状态,布尔值为真 while flag: # 2.根据条件判断结果决定是否执行循环;;首次结果为True;; name = input('请输入用户名:') passwd = input('请输入密码:') if name == '梅西' and passwd == '30': print('登录成功') while flag: # 3.登录成功后;;条件为真,让用户一直输入指令 cmd = input('请输入指令:') if cmd == 'q': # 4.如果输入的指令是q,则给flag赋值为False;;下次的内层while循环条件为False;;然后if判断的代码块也执行完毕,将进行下次外层while循环,条件也为False,结束 print('退游') flag = False print('正在执行您的指令:%s' % cmd) else: print('用户名或密码错误')
循环结构的第二种方式是for循环,for循环可以做的事情while循环都可以实现
在循环取值(遍历值)的时候,for循环比while循环更简洁
for 变量名 in 可迭代对象: 循环体代码 可迭代对象包括:字符串、列表、元组、字典、集合 每一次循环都会将可迭代对象中的一个元素赋值给变量名
# 使用for循环遍历字符串 for a in '阿根廷 足球巨星梅西': print(a) # 注意:空格也是字符串,也会被打印 # 使用for循环遍历列表 player = ['梅西', 'C罗', '贝尔', '莱万', '卡瓦尼'] for name in player: print(name) # 使用for循环遍历元组 for b in (11, 22, 33, 44, 55): print(b) # 使用for循环遍历字典:遍历字典只能获取到到字典的key,value无法直接获取 info = {'name': '梅西', 'age': 35, 'club': 'psg'} for c in info: print(c) # 打印的值为字典的key print(info[c]) # 可以通过的方式打印字典的value # 使用for循环遍历集合 for d in {111, 111, 222, 333, 444}: print(d) # 打印的结果无序,因为集合的特点是无序的;;只打印四个值,因为集合没有重复元素
概念:range是python的一个内置函数,用于生成一系列连续的整数
range方法在python2和python3中有区别:
python2中range是直接产生一个列表,元素很多的情况下比较占用空间
python2中的xrange就相当于python3中的range
python中range相当于口袋,不占空间但是也可以取出很多数据(python3中只有一个range)
range用法 # 用法1:括号内只写一个数字,默认从0开始,顾头不顾尾 for a in range(10): print(a) # 依次打印0~9 # 用法2:括号内写两个数字,自定义起始位置,顾头不顾尾 for b in range(5, 10): print(b) # 依次打印5~9 # 用法3:括号内写三个数字,第三个数字为等差数列的公差,默认为1 for c in range(1, 10, 2): print(c) # 依次打印1 3 5 7 9
range在爬虫方面的应用 url_demo = 'https://movie.douban.com/top250?start=%s&filter=' for i in range(0, 250, 25): # 生成0~250的10个数,公差为25,因为网址每下一页比上一页指定位置的值大25 real_url = url_demo % i # 给链接字符串的占位符传入值,生成可用的链接 print(real_url)
结束本层for循环,与while + break用法一致
for a in range(10): if a == 4: # 当a的值为4时,for循环被break结束,因此只会打印0 1 2 3 break print(a)
结束本次for循环,开始下一次for循环;;与while + continue用法一致
for b in range(6): if b == 4: # 当a的值为4时,结束本次循环,直接开始下一次循环;;因此打印0 1 2 3 5 continue print(b)
for循环正常结束之后运行else子代码;;与while + else用法一致
for c in range(3): print(c) else: print('只有当for循环没有被break打断才会执行')
for i in range(1, 10): # 每进行一次外层for循环,从1~9之间取出一个值,这个值作为乘号左边的数 for j in range(1, i + 1): # 一次外层for循环已经拿到乘号左边的数,因为乘法表每一行所在的行数与该行乘式的个数、以及乘号左边的数值相等;;所以一个完整内层for循环最大值为i,即range(1,i+1) print('%s*%s=%s' % (i, j, i * j), end=' ') # 一次外层for循环的i值是固定的,j的值从1开始取,最大值为i,一行多个乘式不换行(空格打印) print() # 每进行一次完整的外层for循环,即打印完成乘法表的一行,应该换行打印
类型转换 print(int('111'), type(int('111'))) # 可以将只包含整数的字符串转换成整型 print(int('11.22'), type(int('11.22'))) # 报错,含有浮点型的字符串不能被int函数转换 print(int('abc'), type(int('abc'))) # 报错,字符串不能被int函数转换 print(int(222.333), type(int(222.333))) # 浮点型可以被转换成整型
进制转换 # 将十进制转换成其它进制 print(bin(100)) # 0b1100100 二进制 (0b开头) bin是binary的缩写 print(oct(100)) # 0o144 八进制 (0o开头) oct是octal的缩写 print(hex(100)) # 0x64 十六进制(0x开头) hex是hexadecima的缩写 # 其它进制转换成十进制 print(int('0b1100100', 2)) # 这两行代码都是将二进制转换成十进制 print(int(0b1100100)) print(int('0o144', 8)) # 将八进制转换成十进制 print(int(0o144)) print(int('0x64', 16)) # 将十六进制转换成十进制 print(int(0x64))
类型转换 print(float('111.222'), type(float('111.222'))) # 将只包含浮点型的字符串转换成浮点型 print(float(333), type(float(333))) # 将整型转换成浮点型
类型转换:七大数据类型都可以转换成字符串 # 整型转换成字符串 print(str(11), type(str(11))) # 浮点型转换成字符串 print(str(222.333), type(str(222.333))) # 列表转换成字符串 print(str([1, 2, 3, 4]), type(str([1, 2, 3, 4]))) # 字典转换成字符串 print(str({'name': '梅西'}), type(str({'name': '梅西'}))) # 元组转换成字符串 print(str((555, 666, 777, 888)), type(str((555, 666, 777, 888)))) # 集合转换成字符串 print(str({1, 2, 3, 4}), type(str({1, 2, 3, 4}))) # 布尔值转换成字符串 print(str(True), type(str(True)))
# 内置方法 s1 = 'hello world' # 1.索引取值 print(s1[0]) # 类比于列表的索引取值 # 2.切片操作 print(s1[2:4]) # 类比于range()函数,顾头不顾尾 # 3.切片的步长 print(s1[2:9:2]) # lowr 第三个值是公差,默认是1,类比于range函数的用法 print(s1[-1]) # 反向取;;取最后一个值 print(s1[-1:-5:-1]) # dlro 第3个参数还可以控制索引的方向;因为取值的顺序都是从左往右,所以-1的右边已经没有值了 print(s1[-5:-1]) # worl # 4.统计字符串中字符的个数 print(len(s1)) # 11 # 5.成员运算 print('ll' in s1) # 即成员运算符 # 6.移除字符串首尾指定的字符(使用频率较高) name = ' 梅西 ' print(len(name)) res = name.strip() # 默认移除字符串首尾的空格 print(res, len(res)) name1 = '$$$$梅$西$$$$' # 可移除首尾指定的字符,不能移除中间的字符 print(name1.strip('$')) # username = input('username>>>>:').strip() # if username == '梅西': # print('阿根廷球王') # 7.按照指定的字符切割字符串 """split方法切割完字符串之后是一个列表""" info = '梅西|10|PSG|30' print(info.split('|')) # ['梅西', '10', 'PSG', '30'] print(info.split('|', maxsplit=2)) # ['梅西', '10', 'PSG|30'] 第二个参数控制切割的次数;;默认从左开始切 print(info.rsplit('|', maxsplit=1)) # ['梅西|10|PSG', '30'] rspilt的作用是从右开始切