格式化输出补充 流程控制
1 格式化输出补充
1.1 format
: 后面是带填充的字符,只能是一个字符,不指定则默认是用空格填充
^, <, > 分别是居中、左对齐、右对齐,后面的数字是整体宽度。
str1 = '{x}'.format(x='开始执行')
str2 = '{x:*<10}'.format(x='开始执行') # 开始执行******
str3 = '{x:*>10}'.format(x='开始执行') # ******开始执行
str4 = '{x:=^10}'.format(x='开始执行') # ===开始执行===
保留小数点位数
str5 = '{pi:.3f}'.format(pi=3.1415926535898) # 3.142
1.2 f
输出 { 和 }
var = 'hello'
str1 = f'{var}' # hello
str2 = f'{{{var}}}' # {hello} 第一个{让解释器将第二个{视为普通字符
str3 = f'{{{{{var}}}' # {{hello}
{ } 内的字符串可以被当做表达式运行
res = f'{10+3}' # 13
res = f'{print("a")}' # 执行print函数
1.3 %
希望输出%
res = '%s' % 'a' # a
res = '%%%s' % 'a' # %a 第一个%让解释器将第二个%视为普通字符
2 可变类型与不可变类型
2.1 区别
可变类型:值改变,id不变 (list dict)
id不变说明修改的是原内存空间存储的值,即原值是可以被改变的。
不可变类型:值改变,id改变 (int float str bool)
id改变说明产生了新的内存空间来存储数值,并没有影响或改变原值,因此原值是不可被修改的。
不可变类型的数据是不可分割的整体,不能够被改变,
加减乘除等运算都是产生了新的值,跟原来的值没有关系。
a = 10000 # 指向的内存空间存储 10000
a += 1 # 指向了新的内存空间存储 10001
列表这个整体在内存中的地址没有变化,但内部存储的地址可以变化,表现为元素发生了变化。
字典存储的键值对中的值只是个内存地址,可以指向任意类型的数据
但是键必须是不可变类型 (int float str bool)
2 流程控制
2.1 条件
流程控制中的条件可以理解为布尔类型的数据
2.1.1 显式布尔值
- 含有比较运算符的语句,经过判断后会产生一个布尔值。
- True,False
2.1.2 隐式布尔值
所有类型的值都可以当成布尔值去使用。
False:(10种)
数字:0,0.0,0j
None
空容器: 空字符串、空列表[]、空字典{},空元祖(),空集合set()
注意,空字符串中不能包含空格
其余为 True
2.2 运算符
2.2.1 逻辑运算符
- not
将其后面的条件结果取反
not与后面的条件是不可分割的整体。 - and 逻辑与
用于连接两个条件,全真则真,一假即假 - or 逻辑或
用于连接两个条件,全假则假,一真即真 - 优先级
not > and > or
优先级高的先判断
not 2 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
# 1. not
(not 2 > 1) and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
# not 2 > 1 => False
False and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
# 2. and
(False and 3 < 4) or (4 > 5 and 2 > 1 and 9 > 8) or 7 < 6
# =>
False or False or False
# =>
False
2.2.2 成员运算符
判断是否存在,即前者是否为后者的一个成员
in
not in
2.2.3 身份运算符
判断id是否相等,即两个变量是否指向同一个内存区域
is
is not
2.3 流程控制之if判断
流程:代码执行的过程
流程控制:对代码执行的过程进行管控
if判断
通过条件语句的执行结果(True或者False)来决定执行哪一个代码块。
代码块可以理解为一个执行整体单元,以缩进来区分不同的代码块。
可以嵌套,即内部代码块中包含if判断语句。
if判断结构中最多只有一个条件可以成立,因此同层级的代码块最多只有一个可以运行。
语法
if 条件1:
代码块1
elif 条件2:
代码块2
else:
代码块3 # 当以上条件都不成立时执行