Python3自动化运维 - 04 分支循环与深浅拷贝

分支循环

and .. or (历史)

# 如果a < b成立,那么结果为a,否则结果是b
>>> a = 3
>>> b = 4
>>> c = (a < b and a or b) 
>>> 
3

# 另外一种写法
>>> a = 3
>>> b = 4
>>> c = 0
>>> c = a if a < b else b
>>> c
3

if 条件语句

# 条件语句 必须是一个可以用bool值判断的
>>> a = 1

>>> if a == 1:
...  print('a确实是等于1')
... 
a确实是等于1
# 输入结果

>>> if a != 1:
...  print('a确实不等于1')
... 
# 没有输入结果

if a==1:
    print('a==1')
else:
    print('a!=1')

#屏幕显示--------------------------------
>>> if a==1:
...     print('a==1')
... else:
...     print('a!=1')
... 
a==1
#----------------------------------------

if a == 1:
    print('a == 1')
elif a == 2:
    print('a == 2')
elif a == 3:
    print('a == 3')
else:
    print('a不等于1 2 3')
# 输出结果:a == 1

# elif 用来细化条件判断,else后不加条件语句

while 循环语句

while 1:
    print('欢迎访问dbase.cc')
    print('希望您能有所收获')
# 只要条件是真值,执行代码会反复执行,上面这就是条死循环,结束用ctrl+c

summylist = 0
mylist = [1,2,3,4]
while mylist:
    summylist += mylist[0]
    mylist = mylist[1:]

>>> summylist
10

# 说明
sum += mylist[0]    # 求和
mylist = mylist[1:] # 切片并重新赋值

# 调测加print验证
summylist = 0
mylist = [1,2,3,4]
while mylist:
    print(mylist)
    summylist += mylist[0]
    mylist = mylist[1:]
# 输出结果
[1, 2, 3, 4]
[2, 3, 4]
[3, 4]
[4]

# while ... else
# 如果循环正常结束,那么就会执行else里的语句
mylist = [1,2,3,4]
while mylist:
    print(mylist)
    mylist = mylist[1:]
else:
    print('循环正常结束了')
# 输出结果
[1, 2, 3, 4]
[2, 3, 4]
[3, 4]
[4]
循环正常结束了

for 循环语句

# for循环主要用来访问序列和可迭代的数据对象,序列可以是列表、字符串、元组
mystr = 'abc'
for var in mystr:
    print(var)
# 输出以下结果
a
b
c

# 说明
## var是变更名,从序列mystr中一次次取值

dir(str)

for var in mystr:
    var = var.upper()
    print(var)
# 输出以下结果
A
B
C

mylist = [1,2,3,4]
for i in mylist:
    print(i)
# 输出以下结果
1
2
3
4

# for ... else
# 如果循环正常结束,那么就会执行else里的语句
mylist = [1,2,3,4]
for i in mylist:
    print(i)
else:
    print('循环正常结束')
# 输出以下结果
1
2
3
4
循环正常结束

break/continue

# break语句用来终止循环语句,如果是用在嵌套循环中,break语句将停止执行最深层次的循环,并开始执行下一行代码
mylist = [1,2,3,4]
for var in mylist:
    if var == 3:
        break
    print(var)
else:
    print('循环正常结束')
# 输出以下结果
1
2

# continue语句跳出本次循环,跳过这次循环剩下的语句,进行下一轮循环
mylist = [1,2,3,4]
for var in mylist:
    if var == 3:
        continue
    print(var)
else:
    print('循环正常结束')
# 输出以下结果
1
2
4
循环正常结束

mylist = [1,2,3,4]
for var in mylist:
    for var1 in mylist:
        if var1 == 3:
            break
        print(var1)
    print('外层循环的var是:',var)
# 输出以下结果
1
2
外层循环的var是: 1
1
2
外层循环的var是: 2
1
2
外层循环的var是: 3
1
2
外层循环的var是: 4

mylist = [1,2,3]
mylist1 = ['a','b','c']
for var in mylist:
    print('---------------------')
    print('外层循环打印:',var)
    for var1 in mylist1:
        print('内层循环打印:',var1)
# 输出以下结果
---------------------
外层循环打印: 1
内层循环打印: a
内层循环打印: b
内层循环打印: c
---------------------
外层循环打印: 2
内层循环打印: a
内层循环打印: b
内层循环打印: c
---------------------
外层循环打印: 3
内层循环打印: a
内层循环打印: b
内层循环打印: c

# 首先进行外层循环,然后向下会执行到内层循环,内层循环执行完之后,才能继续进行接下来的外层循环

深浅拷贝

深拷贝和浅拷贝: python中一切皆对象,像数字,字符串,元祖,如果在内存中存储了这些元素,那么这块内存中的值是不可以被修改的,但是还存在一些可变对象,比如列表和字典,他们所占有的内存空间是可以修改的,有因为python中使用的是引用计数去节省内存。

引用

>>> mylist
[1, 2, 3]
>>> mylist1 = mylist
>>> id(mylist)
140636455243336
>>> id(mylist1)
140636455243336
>>> mylist
[1, 2, 3]
>>> mylist1
[1, 2, 3]
>>> mylist[0] = 'a'

>>> mylist
['a', 2, 3]
>>> mylist1
['a', 2, 3]

拷贝

>>> del mylist1
>>> mylist1 = mylist[:]
>>> mylist
['a', 2, 3]
>>> mylist1
['a', 2, 3]
>>> mylist[0] = 1
>>> mylist
[1, 2, 3]
>>> mylist1
['a', 2, 3]
>>> id(mylist)
140636455243336
>>> id(mylist1)
140636455268616
# 切片拷贝,内存地址变化 - 这是浅拷贝

浅拷贝

>>> mylist = [1,2,3,['a','b']]
>>> del mylist1
>>> mylist1 = mylist[:]
>>> mylist[-1][0] = 1
>>> mylist
[1, 2, 3, [1, 'b']]
>>> mylist1
[1, 2, 3, [1, 'b']]
# 当使用切片操作拷贝的时候,虽然可以修改外层列表,不影响其他列表,但是内层子列表被修改的时候,却又受到了影响

>>> del mylist
>>> del mylist1
>>> import copy
>>> mylist = [1,2,3,[1,2]]
>>> mylist1 = copy.copy(mylist)
>>> mylist[-1][0] = 'a'
>>> mylist
[1, 2, 3, ['a', 2]]
>>> mylist1
[1, 2, 3, ['a', 2]]
>>> mylist[0] = 'a'
>>> mylist
['a', 2, 3, ['a', 2]]
>>> mylist1
[1, 2, 3, ['a', 2]]

# 浅拷贝 不会拷贝数据中的子对象
## 浅拷贝的方式1: 切片
mylist1 = mylist[:]

## 浅拷贝的方式2: copy.copy()
import  copy                   
mylist1 = copy.copy(mylist)

深拷贝

>>> del mylist
>>> del mylist1
>>> 
>>> mylist = [1,2,3,[1,2]]
>>> import copy
>>> mylist1 = copy.deepcopy(mylist)
>>> mylist
[1, 2, 3, [1, 2]]
>>> mylist1
[1, 2, 3, [1, 2]]

>>> mylist[0] = 'a'
>>> mylist
['a', 2, 3, [1, 2]]
>>> mylist1
[1, 2, 3, [1, 2]]
>>> 
>>> mylist[-1][0] = 'a'
>>> mylist
['a', 2, 3, ['a', 2]]
>>> mylist1
[1, 2, 3, [1, 2]]

# 深拷贝 会拷贝数据中的子对象
## 深拷贝的方式
import  copy
copy.deepcopy()

解决docker容器中文打印乱码问题

>>> print('中文')
  File "<stdin>", line 0
    
    ^
SyntaxError: 'ascii' codec can’t decode byte 0xe4 in position 7: ordinal not in range(128) 

# 查看locale设置
locale
#------------------------------------
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
#------------------------------------

# 查看容器所有语言环境(ubuntu和Centos不一样,下面只列出ubuntu的)
locale -a
#------------------------------------
C
C.UTF-8
POSIX
#------------------------------------
# C.UTF-8可以支持中文,只需要把容器编码设置为C.UTF-8即可(centos是en_US.utf8)

# 改变locale设置
## Centos
export LANG=en_US.utf8

## Ubuntu
export LANG=C.UTF-8

# 执行打印
>>> print('中文')
中文

# 彻底解决在docker镜像中添加
文章目录
  1. 1. 分支循环
    1. 1.1. and .. or (历史)
    2. 1.2. if 条件语句
    3. 1.3. while 循环语句
    4. 1.4. for 循环语句
    5. 1.5. break/continue
  2. 2. 深浅拷贝
    1. 2.1. 引用
    2. 2.2. 拷贝
    3. 2.3. 浅拷贝
    4. 2.4. 深拷贝
  3. 3. 解决docker容器中文打印乱码问题