文章目录
一、 程序与用户交互
1.1、什么是与用户交互
用户交互就是人往计算机中input/输入数据,计算机print/输出结果
1.2、为什么要与用户交互?
为了让计算机能够像人一样与用户沟通交流
比如,过去我们去银行取钱,用户需要把帐号密码告诉柜员,而现在,柜员被ATM机取代,ATM机就是一台计算机,所以用户同样需要将帐号密码告诉计算机,于是我们的程序中必须有相应的机制来控制计算机接收用户输入的内容,并且输出结果
1.3、如何与用户交互
交互的本质就是输入、输出
1.3.1 输入input:
变量名 = input()
变量名 = input(‘可输入提示信息’)
在python3中input功能会等待用户的输入,用户输入任何内容,都存成字符串类型,然后赋值给等号左边的变量名
username=input('请输入您的用户名:')
请输入您的用户名:jack
# username = "jack"
password=input('请输入您的密码:')
请输入您的密码:123
# password = "123"
了解知识:
- 在python2中存在一个raw_input功能与python3中的input功能一模一样
- 在python2中还存在一个input功能,需要用户输入一个明确的数据类型,输入什么类型就存成什么类型
1.3.2 输出print:
前面使用 print() 函数时,都只输出了一个变量,但实际上 print() 函数完全可以同时输出多个变量,而且它具有更多丰富的功能
print() 函数的详细语法格式如下:
print (value,...,sep='',end='\n',file=sys.stdout,flush=False)
从上面的语法格式可以看出,value 参数可以接受任意多个变量或值,因此 print() 函数完全可以输出多个值
user_name = 'Charlie'
user_age = 8
#同时输出多个变量和字符串
print("读者名:",user_name,"年龄:",user_age)
# 读者名: Charlie 年龄: 8
从输出结果来看,使用 print() 函数输出多个变量时,print() 函数默认以空格隔开多个变量,如果读者希望改变默认的分隔符,可通过 sep 参数进行设置。例如输出语句
#同时输出多个变量和字符串,指定分隔符
print("读者名:" ,user_name,"年龄:",user_age,sep='|')
# 读者名:|Charlie|年龄:|8
在默认情况下,print() 函数输出之后总会换行,这是因为 print() 函数的 end 参数的默认值是“\n”,这个“\n”就代表了换行。如果希望 print() 函数输出之后不会换行,则重设 end 参数即可
#设置end 参数,指定输出之后不再换行
print(40,'\t',end="")
print(5O,'\t',end="")
print(60,'\t',end="")
# 40 50 60
file 参数指定 print() 函数的输出目标,file 参数的默认值为 sys.stdout,该默认值代表了系统标准输出,也就是屏幕,因此 print() 函数默认输出到屏幕。实际上,完全可以通过改变该参数让 print() 函数输出到特定文件中
f = open("demo.txt","w")#打开文件以便写入
print('沧海月明珠有泪',file=f)
print('蓝回日暖玉生烟',file=f)
f.close()
上面程序中,open() 函数用于打开 demo.txt 文件,接连 2 个 print 函数会将这 2 段字符串依次写入此文件,最后调用 close() 函数关闭文件
print() 函数的 flush 参数用于控制输出缓存,该参数一般保持为 False 即可,这样可以获得较好的性能
1.3.3 输出之格式化输出
(1)什么是格式化输出
把一段字符串里面的某些内容替换掉之后再输出,就是格式化输出
(2)为什么要格式化输出
我们经常会输出具有某种固定格式的内容,比如:'亲爱的xxx你好!你xxx月的话费是xxx,余额是xxx‘,我们需要做的就是将xxx替换为具体的内容
(3)如何格式化输出
-
占位符方式
%号格式化字符串的方式从Python诞生之初就已经存在,时至今日,python官方也并未弃用%号。但也并不推荐这种格式化方式
print('我的名字是%s,年龄是%s'%('木易','18')) # 以字典的形式传值,打破位置的限制 print('我的名字是%(name)s,年龄是%(age)s'%{'name':'木易','age':'18'}) # %10d 表示输出的整数宽度至少为 10; # %20s 表示输出的字符串宽度至少为 20
-
str.format 兼容性好
该format方法是在Python 2.6中引入的,是字符串类型的内置方法
因为str.format的方式在性能和使用的灵活性上都比%号更胜一筹,所以推荐使用
# 1 使用位置参数 print('{} asked {} to do something'.format('老杨', 'lili')) # 2 使用索引 print('{0}{0}{1}{0}'.format('x','y')) # xxyx # 3 使用关键字参数or字典 # 可以通过关键字or字典方式的方式格式化,打破了位置带来的限制与困扰 print('我的名字是 {name}, 我的年龄是 {age}.'.format(age=18, name='老杨'))
-
f-Strings
python3.5以后推出的x = '老杨' y = 18 print(f'我的名字是{x},年龄是{y}')
二、 基本运算符
2.1 算术运算符
python支持的算术运算符与数学上计算的符号使用是一致的,我们以x=9,y=2为例来依次介绍它们
算术运算符 | 描述 | 示例 |
---|---|---|
+ | 加,两个对象相加 | x+y得11 |
- | 减,两个对象相减 | y-x得-7 |
* | 乘,两个对象相乘 | x*y得18 |
/ | 除,相除后得到的返回值会保留整数与小数部分 | x/y得4.5 |
// | 取整除,相除后得到的返回值只保留整数部分 | x//y得4 |
% | 取余,相除后只返回余数 | x%y得1 |
** | 幂,取一个数的n次方 | x**y得81 |
Python 2.x 中的除法
Python 2.x 只提供了一种除法运算,就是/
,它的行为和大部分编程语言中/
的行为是一样的:
- 当
/
两边都是整数时,结果始终是整数;如果不能除尽,就直接舍弃小数部分 - 当
/
两边有一个是小数时,结果始终是小数;如果恰好除尽,小数部分就是 0
你可以将 Python 2.x 中的/
看作 Python 3.x 中/
和//
的结合体,因为 Python 2.x 中/
的行为有点奇怪,所以 Python 3.x 增加了//
运算符,用以规范除法运算的行为
2.2 比较运算符
比较运算符,也称关系运算符,用于对常量、变量或表达式的结果进行大小比较。如果这种比较是成立的,则返回 True(真),反之则返回 False(假)
比较运算符 | 说明 |
---|---|
> | 大于,如果> 前面的值大于后面的值,则返回 True,否则返回 False |
< | 小于,如果< 前面的值小于后面的值,则返回 True,否则返回 False |
== | 等于,如果== 两边的值相等,则返回 True,否则返回 False |
>= | 大于等于(等价于数学中的 ≥),如果>= 前面的值大于或者等于后面的值,则返回 True,否则返回 False |
<= | 小于等于(等价于数学中的 ≤),如果<= 前面的值小于或者等于后面的值,则返回 True,否则返回 False |
!= | 不等于(等价于数学中的 ≠),如果!= 两边的值不相等,则返回 True,否则返回 False |
is | 判断两个变量所引用的对象是否相同,如果相同则返回 True,否则返回 False |
is not | 判断两个变量所引用的对象是否不相同,如果不相同则返回 True,否则返回 False |
print("89是否大于100:", 89 > 100)
print("24*5是否大于等于76:", 24*5 >= 76)
print("86.5是否等于86.5:", 86.5 == 86.5)
print("34是否等于34.0:", 34 == 34.0)
print("False是否小于True:", False < True)
print("True是否等于True:", True < True)
# 运行结果为
# 89是否大于100: False
# 24*5是否大于等于76: True
# 86.5是否等于86.5: True
# 34是否等于34.0: True
# False是否小于True: True
# True是否等于True: False
== 和 is 的区别
初学 Python,大家可能对 is 比较陌生,很多人会误将它和 == 的功能混为一谈,但其实 is 与 == 有本质上的区别,完全不是一码事儿。
== 用来比较两个变量的值是否相等,而 is 则用来比对两个变量引用的是否是同一个对象
那么,如何判断两个对象是否相同呢?答案是判断两个对象的内存地址。如果内存地址相同,说明两个对象使用的是同一块内存,当然就是同一个对象了;这就像两个名字使用了同一个身体,当然就是同一个人了
2.3 赋值运算符
赋值运算符用来把右侧的值传递给左侧的变量(或者常量);可以直接将右侧的值交给左侧的变量,也可以进行某些运算后再交给左侧的变量,比如加减乘除、函数调用、逻辑运算等
python语法中除了有=号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简。我们以x=9,y=2为例先来介绍一下增量赋值
2.3.1 增量赋值
赋值运算符 | 描述 | 示例 |
---|---|---|
= | 简单赋值运算 | x = 10 |
+= | 加法赋值运算 | x += 1 # 等同于x=x+1 |
-= | 减法赋值运算 | x -= 1 # 等同于x=x-1 |
*= | 乘法赋值运算 | 同上 |
/= | 除法赋值运算 | 同上 |
//= | 取整除赋值运算 | 同上 |
%= | 取余赋值运算 | 同上 |
**= | 幂赋值运算 | 同上 |
2.3.2 链式赋值
如果我们想把同一个值同时赋值给多个变量名,可以这么做
z=10
y=z
x=y
print(x,y,z)
# (10, 10, 10)
链式赋值指的是可以用一行代码搞定这件事
x=y=z=10
print(x,y,z)
# (10, 10, 10)
2.3.3 交叉赋值
我们定义两个变量m与n
m=10
n=20
如果我们想将m与n的值交换过来,可以这么做
temp=m
m=n
n=temp
print(m,n)
# (20, 10)
交叉赋值指的是一行代码可以搞定这件事
m=10
n=20
m,n=n,m # 交叉赋值
print(m,n)
# (20, 10)
2.3.4 解压赋值
如果我们想把列表中的多个值取出来依次赋值给多个变量名,可以这么做
nums=[11,22,33,44,55]
a=nums[0]
b=nums[1]
c=nums[2]
d=nums[3]
e=nums[4]
print(a,b,c,d,e)
# (11, 22, 33, 44, 55)
解压赋值指的是一行代码可以搞定这件事
a,b,c,d,e=nums # nums包含多个值,就好比一个压缩包,解压赋值因此得名
print(a,b,c,d,e)
# (11, 22, 33, 44, 55)
注意,上述解压赋值,等号左边的变量名个数必须与右面包含值的个数相同,否则会报错
但如果我们只想取头尾的几个值,可以用*_匹配
a,b,*_=nums
print(a,b)
# (11, 22)
ps:字符串、字典、元组、集合类型都支持解压赋值
2.4 逻辑运算符
高中数学中我们就学过逻辑运算,例如 p 为真命题,q 为假命题,那么“p且q”为假,“p或q”为真,“非q”为真。Python也有类似的逻辑运算
逻辑运算符 | 含义 | 基本格式 | 说明 |
---|---|---|---|
and | 逻辑与运算,等价于数学中的“且” | a and b | 当 a 和 b 两个表达式都为真时,a and b 的结果才为真,否则为假 |
or | 逻辑或运算,等价于数学中的“或” | a or b | 当 a 和 b 两个表达式都为假时,a or b 的结果才是假,否则为真 |
not | 逻辑非运算,等价于数学中的“非” | not a | 如果 a 为真,那么 not a 的结果为假;如果 a 为假,那么 not a 的结果为真。相当于对 a 取反 |
逻辑运算符一般和关系运算符结合使用,例如
14>6 and 45.6 > 90
14>6 结果为 True,成立,45.6>90 结果为 False,不成立,所以整个表达式的结果为 False,也即不成立
有些不负责任的 Python 教程说:Python 逻辑运算符用于操作 bool 类型的表达式,执行结果也是 bool 类型,这两点其实都是错误的!
Python 逻辑运算符可以用来操作任何类型的表达式,不管表达式是不是 bool 类型;同时,逻辑运算的结果也不一定是 bool 类型,它也可以是任意类型
print(100 and 200)
print(45 and 0)
print("" or "我是木易")
print(18.5 or "我是木易")
# 200
# 0
# 我是木易
# 18.5
本例中 and 和 or 运算符操作的都不是 bool 类型表达式,操作的结果也不是 bool 值
逻辑运算符的本质
在 Python 中,and 和 or 不一定会计算右边表达式的值,有时候只计算左边表达式的值就能得到最终结果。
另外,and 和 or 运算符会将其中一个表达式的值作为最终结果,而不是将 True 或者 False 作为最终结果。
以上两点极其重要,了解这两点不会让你在使用逻辑运算的过程中产生疑惑
对于 and 运算符,两边的值都为真时最终结果才为真,但是只要其中有一个值为假,那么最终结果就是假,所以 Python 按照下面的规则执行 and 运算:
- 如果左边表达式的值为假,那么就不用计算右边表达式的值了,因为不管右边表达式的值是什么,都不会影响最终结果,最终结果都是假,此时 and 会把左边表达式的值作为最终结果
- 如果左边表达式的值为真,那么最终值是不能确定的,and 会继续计算右边表达式的值,并将右边表达式的值作为最终结果
对于 or 运算符,情况是类似的,两边的值都为假时最终结果才为假,只要其中有一个值为真,那么最终结果就是真,所以 Python 按照下面的规则执行 or 运算
- 如果左边表达式的值为真,那么就不用计算右边表达式的值了,因为不管右边表达式的值是什么,都不会影响最终结果,最终结果都是真,此时 or 会把左边表达式的值作为最终结果
- 如果左边表达式的值为假,那么最终值是不能确定的,or 会继续计算右边表达式的值,并将右边表达式的值作为最终结果
2.5 成员运算符
-
in
某一个对象包含于另外一个对象则返回True
字符串,列表,元祖,字典,集合都支持成员运算
a = 'hello' in 'hello world' print(a)
-
not in
某一个对象没有包含于另外一个对象则返回True
a = 'hello' not in 'hello world' print(a)
注意:虽然下述两种判断可以达到相同的效果,但我们推荐使用第二种格式,因为not in语义更加明确
not 'lili' in ['jack','tom','robin']
# True
'lili' not in ['jack','tom','robin']
# True