与用户交互、格式化输出、基本运算符

一、程序与用户交互

1.1什么是与用户交互

用户交互就是人往计算机中input/输入数据,计算机print/输出结果

1.2为什么要与用户交互

为了让计算机能够像人一样与用户沟通交流

比如,过去我们去银行取钱,用户需要把帐号密码告诉柜员,而现在,柜员被ATM机取代,ATM机就是一台计算机,所以用户同样需要将帐号密码告诉计算机,于是我们的程序中必须有相应的机制来控制计算机接收用户输入的内容,并且输出结果

1.3如何与用户交互

交互的本质就是输入、输出

1.3.1输入input:

password = input('请输入你的密码:>>>')
print(password, type(password)) # input接受的所有数据类型都是str类型

# print(password == '123')  # 会报错,因为python中==比较的是数据值和数据类型

# 整型和字符串的相互改变
print(int(password) == 123)  
print(password == str(123))  

1.3.2输出print

print(value, ..., sep=' ', end=' ', file=sys.stdout, flush=False)
sep:seperator,分隔符,默认是空格
end:print会自动换行,end='',取消自动换行

print(123)
print(456)
#输出 123
#输出 456

print(123, end='')
print(456)
#输出 123456

练习:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式
------------ info of Tony -----------
Name : Tony
Age : 22
Sex : male
Job : Teacher
------------- end -----------------

name = input('Name  : ')
age = input('Age   : ')
sex = input('Sex   : ')
job = input('Job   : ')
print(
      '-' * 12, 'info of %s' % (name), '-' * 11,
      '\nName  : %s'
      '\nAge   : %s'
      '\nSex   : %s'
      '\nJob   : %s'
      % (name, age, sex, job),
      '\n', '-' * 13, "end", '-' * 17
)

二、格式化输出

2.1什么是格式化输出?

把一段字符串里面的某些内容替换掉之后再输出,就是格式化输出。

2.2为什么要格式化输出?

我们经常会输出具有某种固定格式的内容,比如:'亲爱的xxx你好!你xxx月的话费是xxx,余额是xxx‘,我们需要做的就是将xxx替换为具体的内容。

2.3占位符

# %s称为占位符(掌握)可以为所有的数据类型占位
res = '亲爱的%s你好!你%s月的话费是%s,余额是%s,我们需要做的就是将xxx替换为具体的内容。'
print(res % ('kevin', 2, 46, 99999999))
print(res % ('kevin1', 2, 57, 100))
print(res % ('kevin2', 2, 33, 1199999))

res1 = 'my name is %s'
print(res1 % 'tony')

# %d占位符(了解)只能给数字类型占位
print("金额:%08d" % 111)
print("金额:%08d" % 666666)
print("金额:%08d" % 99999999999)

三、基本运算符

3.1算术运算符

以下假设变量: a=10,b=20:

3.2比较运算符

3.3赋值运算符

python语法中除了有=号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简

3.3.1增量赋值

3.3.2链式赋值

x = 10
y = x
z = y
x, y, z
#输出(10, 10, 10)

3.3.3交叉赋值

m = 10
n = 20
n, m = m, n  # m, n是转换成元组(10 ,20)的形式
print(n,m)
#输出(10, 20)

t = 1, 2  # 即是t=(1,2)
print(type(t))
#输出<class 'tuple'>

3.3.4解压赋值(重点)

原理:将后面的数据按照顺序分别赋值给前面,所以左右两边的个数必须一致,少了或者多了就会报错

names_list = ['kevin', 'tony', 'tank', 'tom']
l1 = names_list[0]  # 分别取出列表中的数据
l2 = names_list[1]
l3 = names_list[2]
l4 = names_list[3]
print(l1, l2, l3, l4) # 这样的方式比较麻烦

# ll1, ll2, ll3, ll4 = ['kevin', 'tony', 'tank', 'tom']
ll1, ll2, ll3, ll4 = names_list
print(ll1, ll2, ll3, ll4)

列表中有大量元素,只取前面几位或者后面几位的方法,可以用*_匹配(了解)
原理:把列表中第一个'kevin'赋值给l1,最后一个'tom',赋值给l4,剩下中间的元素全部赋值给星号后面的变量

l1, *a, l4 = ['kevin', 'tony', 'tank','a','b', 'tom']
print(l1, a, l4)   
#输出kevin ['tony', 'tank', 'a', 'b'] tom

ll1, *a, ll3, ll4 = ['kevin', 'tony', 'tank','a','b', 'tom']
print(ll1, a, ll4)  
#输出kevin ['tony', 'tank', 'a'] tom

3.4逻辑运算符

3.4.1and 与

可以用and连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为False,则无需再往右判断,可以立即判定最终结果就为False,只有在所有条件的结果都为True的情况下,最终结果才为True。

2 > 1 and 1 != 1 and True and 3 > 2 # 判断完第二个条件,就立即结束,得的最终结果为False
#输出False

3.4.2or 或

可以用or连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为True,则无需再往右判断,可以立即判定最终结果就为True,只有在所有条件的结果都为False的情况下,最终结果才为False

2 > 1 or 1 != 1 or True or 3 > 2 # 判断完第一个条件,就立即结束,得的最终结果为True
#输出True

3.4.3not 非(取反)

混用and、or、not

优先级not>and>or(最好使用括号来区分优先级)

3.5成员运算符

判断某个个体是否在某个群体中,可以是字符串,列表或元组
符号:in(在) not in(不在)

name_list = ['kevin', 'jack', 'tony', 'tom']

print('kevin' in name_list)  
#输出True
print('kevin' not in name_list)  
#输出False
print('aaa' not in name_list)  
#输出True
print('bbb' in name_list)  
#输出False

# 判断某个字符串是否在另一个字符串中:
print('k' in 'kevin')  
#输出True
print('hello' in 'helloworld') 
#输出True

3.6身份运算符

比较两个对象的存储单元,判断两个值是否相等
符号: is is not

is和==的区别:

== 比较的是“值”(Value),而 is 比较的是“身份”(Identity,即内存地址)。

值相等的内存地址不一定相等,内存地址相等的值一定相等

特性 == (相等性比较) is (身份比较)
比较内容 对象的值是否相等 两个变量是否指向同一个内存对象
底层原理 调用对象的 __eq__() 魔术方法 比较 id() 返回值(内存地址)
通俗理解 “这两个东西长得一样吗?” “这两个东西是同一个东西吗?”
# is(比较的是内存地址) ==(比较的是值)
a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(a == b)  # True  (值相同)
print(a is b)  # False (内存地址不同,是两个独立的列表)
print(a is c)  # True  (c 就是 a,指向同一个内存地址)

总结:

  • 比内容,用 ==(日常主力)
  • 判 None / True / False,用 is(严谨安全)
  • 比数字 / 字符串 / 列表内容,绝对不要用 is(容易踩坑)

1.平常什么情况下用 ==?
结论:99% 的日常业务逻辑判断,都用 ==。
只要你的目的是“判断内容是否一致”,就应该用 ==。

  • 比较字符串内容:if username == "admin":
  • 比较数字大小/相等:if age == 18:
  • 比较列表/字典/集合的内容:if config == default_config:
  • 比较自定义对象的属性:只要你在类中实现了 eq 方法,就可以用 == 来判断两个实例是否“逻辑上相等”。

2.平常什么情况下用 is?
结论:is 的使用场景非常局限,通常只用于以下 3 种情况:
① 与单例对象比较(最常用)
Python 中有一些内置的单例对象,判断它们时必须/强烈建议用 is,而不是 ==。

# 判断 None
if result is None:
    print("结果为空")

# 判断 True / False (虽然 == True 也能用,但 is 更严谨且更快)
if flag is True:
    do_something()

"""为什么不用 ==? 因为自定义类可以重写 __eq__ 方法,obj == None 可能会引发意想不到的行为或报错,而 is 是绝对安全的"""

② 判断两个变量是否真的指向同一个可变对象
当你需要确认修改一个变量会不会影响到另一个变量时。

list1 = [1, 2, 3]
list2 = list1  # 浅引用

if list1 is list2:
    print("修改 list1 会影响 list2")  # 会打印

③ 性能优化(极少用)
因为 is 只比较内存地址,不需要调用 eq 方法,所以它的执行速度比 == 快。但在现代 Python 中,除非在极度高频的底层循环中,否则这点性能差异完全可以忽略,不建议为了性能而滥用 is。

4.考验:如果一个字符串3,一个字符串5,判断他俩是否相等,用什么?
判断字符串 "3" 和 "5" 是否相等,毫无疑问应该使用 ==。
目的是比较它们的内容(值)是否相同。

a = "3"
b = "5"

if a == b:
    print("相等")
else:
    print("不相等")  # 会输出这个

为什么绝对不能用 is?
正如前面提到的,is 比较的是内存地址。虽然 Python 有“字符串驻留机制”(String Interning),对于某些简单的、像变量名的短字符串(比如 "a" 或 "hello"),Python 可能会在内存中复用同一个对象,导致 is 碰巧返回 True。
但是,"3" 和 "5" 的内容不同,它们绝对不会是同一个内存对象。所以 a is b 必然返回 False。
退一步说,即使你比较的是两个内容相同的字符串,比如 a = "3" 和 b = "3",也不要用 is。因为字符串驻留机制是 CPython 的底层优化细节,不是 Python 语言的标准规范。如果字符串是通过用户输入、文件读取或复杂拼接得到的,即使内容一样,is 也可能返回 False。

延伸:如果你想比较它们的“数值大小”
如果你不仅想知道它们是否相等,还想判断谁大谁小,你需要先将它们转换为数字(int 或 float),然后再用 ==、>、< 进行比较:

a = "3"
b = "5"

# 直接比较字符串,是按字典序比较的
print(a > b)      # False ("3" 的 ASCII 码小于 "5")
print("10" > "5") # False (字符串比较时,"1" < "5",所以 "10" < "5")

# 转换为数字后再比较(推荐)
print(int(a) == int(b))  # False
print(int(a) < int(b))   # True

总结: 只要是判断字符串内容是否一样,永远使用 ==。

posted @ 2023-02-20 12:15  星空看海  阅读(56)  评论(0)    收藏  举报