Python入门——循环

一、深浅copy

什么是深浅拷贝

  • 浅拷贝:是把原列表第一层的内存地址完全拷贝一份给新列表。即只能保证对原列表中第一层地址(不可变类型)的改操作不受影响,涉及到原列表中第二层地址(可变类型)的改操作时,原列表变,新列表也跟着变-

    img

  • 深拷贝:将两个列表的改操作完全的独立开。即不管原列表对第几层地址的改操作,新列表都不受影响,保持最开始复制的列表元素不变。

    img

怎么用深浅拷贝

'''
浅拷贝:列表中的不可变类型元素改变,新列表中的不可变类型元素不变,
列表中的可变类型元素改变,新列表的不可变类型元素也跟着变
'''
list1 = ['Umi', 2233, ['Egon', 'Alex']]
list2 = list1.copy()
print('list1:', id(list1), id(list1[0]), id(list1[1]), id(list1[2]))
print('list2:', id(list2), id(list2[0]), id(list2[1]), id(list2[2]))
print(list1)	# ['Umi', 2233, ['Egon', 'Alex']]
print(list2)	# ['Umi', 2233, ['Egon', 'Alex']]

# 对于不可变类型的赋值、都是产生了新值,让原列表的索引指向新的内存地址、并不会影星新列表
list1[0] = 'UMI'
list1[1] = 21
'''
但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,
即原列表的索引指向仍然指向原来的内存地址,
于是新列表也跟着受影响,如下
'''
list1[2][0] = 'EGON'
list1[2][1] = 'ALEX'
print(list1)	# ['UMI', 21, ['EGON', 'ALEX']]
print(list2)	# ['Umi', 2233, ['EGON', 'ALEX']]


# 深拷贝
import copy
list1 = ['Umi', 2233, ['Egon', 'Alex']]
list2 = copy.deepcopy(list1)
#                  不可变        不可变          可变
print('list1:', id(list1[0]), id(list1[1]), id(list1[2]))
print('list2:', id(list2[0]), id(list2[1]), id(list2[2]))

list1[0] = 'UMI'
list1[1] = 21
list1[2][0] = 'EGON'
list1[2][1] = 'ALEX'
print(list1)	# ['UMI', 21, ['EGON', 'ALEX']]
print(list2)	# ['Umi', 2233, ['Egon', 'Alex']]

二、循环结构——while循环

什么是循环结构

  • 循环结构就是重复执行某段代码块

为什么要用循环结构

  • 让计算机能够具备人重复执行某件事情的能力

如何使用循环结构

  1. while循环语法

    while 条件:
        代码1
        代码2
        代码3
    
    '''
    while的运行步骤:
    步骤1:如果条件为真,则自上而下的执行代码1、2、3...
    步骤2:执行完最后一条代码时再次判断条件,如果条件为Treu则重复步骤1,如果条件为False,则结束循环
    
    '''
    
  2. while循环以应用案例

    • 案例1:while循环的基本使用

      # 用户认证程序
      # 为了避免代码的重复,所以引入while循环
      
    • 案例2:while+break的使用

      • 注意break用来结束本层循环,break后面的代码都不会执行
      # break结束本层循环
      username = "jason"
      password = "123"
      # 记录错误验证的次数
      count = 0
      while count < 3:
          inp_name = input("请输入用户名:")
          inp_pwd = input("请输入密码:")
          if inp_name == username and inp_pwd == password:
              print("登陆成功")
              break # 用于结束本层循环
          else:
              print("输入的用户名或密码错误!")
              count += 1
      
    • 案例3:while循环嵌套+break

      # 如果while循环嵌套了很多层,要想退出每一层循环则需要在每一层循环都有一个break
      username = "jason"
      password = "123"
      count = 0
      while count < 3:  # 第一层循环
          inp_name = input("请输入用户名:")
          inp_pwd = input("请输入密码:")
          if inp_name == username and inp_pwd == password:
              print("登陆成功")
              while True:  # 第二层循环
                  cmd = input('>>: ')
                  if cmd == 'quit':
                      break  # 用于结束本层循环,即第二层循环
                  print('run <%s>' % cmd)
              break  # 用于结束本层循环,即第一层循环
          else:
              print("输入的用户名或密码错误!")
              count += 1
      
    • 案例4:while循环嵌套+tag的使用

      '''
      让所有while循环的条件都用同一个变量,该变量的初始值为True,
      一旦在某一层将该变量的值改成False,则所有层的循环都结束
      '''
      username = "jason"
      password = "123"
      count = 0
      
      tag = True
      while tag: 
          inp_name = input("请输入用户名:")
          inp_pwd = input("请输入密码:")
          if inp_name == username and inp_pwd == password:
              print("登陆成功")
              while tag:  
                  cmd = input('>>: ')
                  if cmd == 'quit':
                      tag = False  # tag变为False, 所有while循环的条件都变为False 
                      break
                  print('run <%s>' % cmd)
              break  # 用于结束本层循环,即第一层循环
          else:
              print("输入的用户名或密码错误!")
              count += 1
      
    • 案例5:while+continue的使用

      • continue用来跳出当前次循环(即跳过本次循环直接进入下一次循环)
      • 注意:在continue之后添加同级代码毫无意义,因为永远无法运行
      # 打印1到10之间,除7以外的所有数字
      number=11
      while number>1:
          number -= 1
          if number==7:
              continue 
          print(number)
      
    • 案例6:while+else的使用

      • 注意:如果while循环被break终止了,则不会运行else里的代码
      # 无break
      count = 0
      while count <= 5 :
          count += 1
          print("Loop",count)
      else:
          print("循环正常执行完啦")
      print("-----out of while loop ------")
      输出
      Loop 1
      Loop 2
      Loop 3
      Loop 4
      Loop 5
      Loop 6
      循环正常执行完啦   #没有被break打断,所以执行了该行代码
      -----out of while loop ------
      
      # 有break
      count = 0
      while count <= 5 :
          count += 1
          if count == 3:
              break
          print("Loop",count)
      else:
          print("循环正常执行完啦")
      print("-----out of while loop ------")
      输出
      Loop 1
      Loop 2
      -----out of while loop ------ #由于循环被break打断了,所以不执行else后的输出语句
      
  3. while循环练习

    • 练习1:寻找1到100之间数字7最大的倍数(结果是98)

      number = 100
      while number >= 1:
          if number % 7 == 0:
              print(number)
              break
          number -= 1
      
      
    • 练习2:猜年龄

      Umi = 21
      tag = True
      while flog:
          inp_age = input("请输入年龄:").strip()
          if inp_age.isdigit():
              age = int(inp_age)
              if age > Umi:
                  print('猜大啦')
              elif age < Umi:
                  print('猜小啦')
              else:
                  print('猜对了')
                  tag = False
          else:
              print('请输入数字')
      
      

三、for循环

什么是for循环

  • for循环是python提供的第二种循环机制

为何要用for循环

  • 理论上for循环能做的,while循环都能做
  • for循环在循环取值(遍历取值)比while循环更简洁

如何用for循环

  • for循环与while循环的异同

    '''
    # 相同之处:都是循环,for循环可以干的while循环都能干
    # 不同之处:
    		while循环称之为条件循环,循环次数取决于条件何时变为假
    		for循环称之为"取值循环",循环次数取决in后包含的值的个数
    # for x in [1, 2, 3]:
        print('====>')
        print('88888')
    '''
    
    
  1. for循环语法

    for 变量名 in 可迭代对象(字符串、列表、字典):
        代码1
        代码2
        ...
        
    #例1
    for item in ['a','b','c']:
        print(item)
    # 运行结果
    a
    b
    c    
    
    # 参照例1来介绍for循环的运行步骤
    # 步骤1:从列表['a','b','c']中读出第一个值赋值给item(item=‘a’),然后执行循环体代码
    # 步骤2:从列表['a','b','c']中读出第二个值赋值给item(item=‘b’),然后执行循环体代码
    # 步骤3: 重复以上过程直到列表中的值读尽
    
    
  2. for循环应用案例

    • 案例1:打印数字0-5

      '''
      for i in [0,1,2,3,4,5]:
      	print(i)
      '''
      
      # for循环控制循环次数:range()
      # range(),顾头不顾尾,只能取到从头开始到尾的前一个数的值
      for i in range(0, 6):
          print(i)
      
      
    • range补充(了解)

      # 1、for搭配range,可以按照索引取值,但是麻烦,所以不推荐
      l=['aaa','bbb','ccc'] # len(l)
      for i in range(len(l)):
          print(i,l[i])
      
      for x in l:
          print(l)
      # 2、range()在python3里得到的是一只"会下蛋的老母鸡"
      '''
      >>> range(3)
      range(0, 3)
      >>>
      '''
      
      # range()在python2里得到的是一框"鸡蛋"
      '''
      >>> range(3)
      [0, 1, 2]
      >>>
      '''
      
      
    • 案例2:for+continue、for+break(唯一能终止for循环的方案)、for+else

      # 与while循环相同
      
      # for+continue
      '''
      for i in range(6):
          if i == 4:
              continue
          print(i)
      '''
      
      # for+break(终止for循环只有break一种方案)
      '''
      for i in range(6):
          if i == 4:
              break
          print(i)
      '''
      
      # for+else
      '''
      for i in range(6):
      	print(i)
      else:
      	print('else已被执行')
      '''
      
      
    • 案例3:遍历字典

      '''
      # 遍历字典默认遍历的是字典的key
      # .keys():遍历字典的key
      # .values():遍历字典的value
      # .items():遍历字典的key:value(返回值是元组)
      '''
      dic = {'name': 'Umi', 'age': 21, 'sex': 'male', 'birth': '1999-04-05'}
      for i in dic:
          print(i)
      
      
    • 案例4:for循环嵌套

      for i in range(3):
          print('外层循环——>', i)
        for j in range(5):
              print('内存——>', j)
      
      
  3. for循环练习

    • 练习1:打印九九乘法表

      for i in range(1, 10):
          for j in range(1, i+1):
              print('{i} * {j} = {z} '.format(i=i, j=j, z=i*j), end=' ')
          print()
      
      
    • 练习2:打印金字塔

      for line in range(0, 5):
          for space in range(1, 5-line):
              print(' ', end='')
          for star in range(0, 2*line+1):
          	print('*', end='')
          print('')
      
      
posted @ 2020-03-09 13:15  群青-Xi  阅读(178)  评论(0编辑  收藏  举报