一、基本运算符
运算符是可以操纵操作数值的结构。如下一个表达式:10 + 20 = 30
。这里,10
和20
称为操作数,+
则被称为运算符,Python基本运算符包括算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符和身份运算符。
1. 算数运算符
以下假设变量 a=10,变量 b=21:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | a + b 输出结果 31 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -11 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 210 |
/ | 除 - x 除以 y | b / a 输出结果 2.1 |
% | 取模 - 返回除法的余数 | b % a 输出结果 1 |
** | 幂 - 返回x的y次幂 | a**b 为10的21次方 |
// | 取整除 - 往小的方向取整数 | 9//2 4 -9//2 -5 |
a = 21
b = 10
c = 0
c = a + b
print ("1 - c 的值为:", c)
c = a - b
print ("2 - c 的值为:", c)
c = a * b
print ("3 - c 的值为:", c)
c = a / b
print ("4 - c 的值为:", c)
c = a % b
print ("5 - c 的值为:", c)
# 修改变量 a 、b 、c
a = 2
b = 3
c = a**b
print ("6 - c 的值为:", c)
a = 10
b = 5
c = a//b
print ("7 - c 的值为:", c)
以上输出结果:
1 - c 的值为: 31
2 - c 的值为: 11
3 - c 的值为: 210
4 - c 的值为: 2.1
5 - c 的值为: 1
6 - c 的值为: 8
7 - c 的值为: 2
2. 比较运算符
以下假设变量 a=10,变量 b=21:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True。 |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。 这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 True。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 True。 |
a = 21
b = 10
c = 0
if ( a == b ):
print ("1 - a 等于 b")
else:
print ("1 - a 不等于 b")
if ( a != b ):
print ("2 - a 不等于 b")
else:
print ("2 - a 等于 b")
if ( a < b ):
print ("3 - a 小于 b")
else:
print ("3 - a 大于等于 b")
if ( a > b ):
print ("4 - a 大于 b")
else:
print ("4 - a 小于等于 b")
# 修改变量 a 和 b 的值
a = 5
b = 20
if ( a <= b ):
print ("5 - a 小于等于 b")
else:
print ("5 - a 大于 b")
if ( b >= a ):
print ("6 - b 大于等于 a")
else:
print ("6 - b 小于 a")
以上输出结果:
1 - a 不等于 b
2 - a 不等于 b
3 - a 大于等于 b
4 - a 大于 b
5 - a 小于等于 b
6 - b 大于等于 a
3. 赋值运算符
python语法中除了有=号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简。
3.1 增量赋值
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | (c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
3.2 链式赋值
链式赋值是指将多个变量同时赋值的一种方法。在Python中,可以使用多个变量名来同时接收一个序列(如列表、元组)中的多个元素,或者使用多个变量名来同时将一个表达式的多个值赋给不同的变量。
如下把一个变量值赋值个多个变量名
x = 111
y = 111
z = 111
x, y, z = 111 #可以直接写成
print(x, y, z)
3.3 交叉赋值
交叉赋值是一种同时交换两个或多个变量值的方式。
以下假设变量a为10,变量b为20:
a = 10
b = 20
# 交换a和b的变量值 首先需要一个空的变量名
c = a
a = b
b = c
print(a, b) # 20,10
交叉赋值指的是一行代码搞定,非常方便
a, b = b, a
3.4 解压赋值
解压赋值是一种快速从可迭代对象(如列表或元组)中获取值并同时赋值给多个变量的方法。
如果我们想把列表中的多个值取出来依次赋值给多个变量名,可以这么做
>>> nums=[11,22,33,44,55]
>>>
>>> a=nums[0]
>>> b=nums[1]
>>> c=nums[2]
>>> d=nums[3]
>>> e=nums[4]
>>> a,b,c,d,e
(11, 22, 33, 44, 55) # 输出结果
解压赋值指的是一行代码搞定
>>> a,b,c,d,e=nums # nums包含多个值,就好比一个压缩包,解压赋值因此得名
>>> a,b,c,d,e
(11, 22, 33, 44, 55) # 输出结果
注意,上述解压赋值,等号左边的变量名个数必须与右面包含值的个数相同,否则会报错
#1、变量名少了
>>> a,b=nums
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
#2、变量名多了
>>> a,b,c,d,e,f=nums
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 6, got 5)
但如果我们只想取头尾的几个值,可以用*加上任意字母匹配
>>> a,b,*_=nums
>>> a,b
(11, 22) # 输出结果
把列表里面没有变量赋予的值都交给*后面的变量命名并且以列表的形式返回
4. 逻辑运算符
关键字: and or not (逻辑运算符用于连接多个条件,进行关联判断,会返回布尔值True或False)
and:与---------->and两边的值必须都是True的时候,整体结果才是True
or: 或者---------->or两边的值只要有一个是真,整体结果就是真
not: 非,取反-------->not取反
以下假设变量 a 为 10, b为 20:
运算符 | 逻辑表达方式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。 | (a and b) 返回 20。 |
or | x or y | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not | not x | 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
4.1 连续多个and
可以用and连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为False,则无需再往右判断,可以立即判定最终结果就为False,只有在所有条件的结果都为True的情况下,最终结果才为True。
>>> 2 > 1 and 1 != 1 and True and 3 > 2 # 判断完第二个条件,就立即结束,得的最终结果为False
False
4.2 连续多个or
可以用or连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为True,则无需再往右判断,可以立即判定最终结果就为True,只有在所有条件的结果都为False的情况下,最终结果才为False。
>>> 2 > 1 or 1 != 1 or True or 3 > 2 # 判断完第一个条件,就立即结束,得的最终结果为True
True
4.3优先级 not>and>or
#1、三者的优先级关系:not>and>or,同一优先级默认从左往右计算。
>>> 3>4 and 4>3 or 1==3 and 'x' == 'x' or 3 >3
False
#2、最好使用括号来区别优先级,其实意义与上面的一样
'''
原理为:
(1) not的优先级最高,就是把紧跟其后的那个条件结果取反,所以not与紧跟其后的条件不可分割
(2) 如果语句中全部是用and连接,或者全部用or连接,那么按照从左到右的顺序依次计算即可
(3) 如果语句中既有and也有or,那么先用括号把and的左右两个条件给括起来,然后再进行运算
'''
>>> (3>4 and 4>3) or (1==3 and 'x' == 'x') or 3 >3
False
#3、短路运算:逻辑运算的结果一旦可以确定,那么就以当前处计算到的值作为最终结果返回
>>> 10 and 0 or '' and 0 or 'abc' or 'egon' == 'dsb' and 333 or 10 > 4
我们用括号来明确一下优先级
>>> (10 and 0) or ('' and 0) or 'abc' or ('egon' == 'dsb' and 333) or 10 > 4
短路: 0 '' 'abc'
假 假 真
返回: 'abc'
#4、短路运算面试题:
>>> 1 or 3
1
>>> 1 and 3
3
>>> 0 and 2 and 1
0
>>> 0 and 2 or 1
1
>>> 0 and 2 or 1 or 4
1
>>> 0 or False and 1
False
5. 成员运算符
关键字:in(在) not in(不在)
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
eg:
names_list = ['kevin', 'tony', 'tank', 'jerry']
# 判断jerry这个人在不在列表中
print('jerry' in names_list)
# print('jer1' in 'jerry') # True False
d = {'username':'kevin', 'age':18}
'''如果是字典,判断的是字典的key值,字典暴露给外界是key'''
print('kevin' in d) # False
print('username' in d) # True
print('age' in d)
6. 身份运算符
关键字:in(在) not in(不在)
运算符 | 描述 | 实例 |
---|---|---|
is | 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
not is | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(x) != id(y)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
关键字:is(比较的是内存地址,id值) ==(比较值的)
############身份运算
# s1 = 'hello'
s1 = [1, 2, 3, 4,]
# s2 = 'hello'
s2 = [1, 2, 3, 4,]
print(s1 == s2)
print(s1 is s2) # False
"""值相等的,内存地址不一定相等"""
"""内存地址相等的,值一定相等"""
二、流程控制
流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:顺序结构(之前我们写的代码都是顺序结构)、分支结构(用到if判断)、循环结构(用到while与for)
控制事物的执行流程
执行流程总共有三种:
- 顺序结构
我们之前写的代码执行顺序就是一种顺序结构,按照顺序一一执行- 分支结构
就是按照条件的成功与否,决定执行哪个分支.- 循环结构
重复执行某一个流程
注意事项:
- 所有的条件都会转为布尔值进行判断
- 在Python中,我们使用缩进来表示代码的从属关系
# 一般我们使用四个空格来表示一个缩进- 不是所有的代码都有从属关系
- 同属于一个代码块的子代码块缩进量要保持一致
小技巧:如果上面一行代码的结尾是冒号:那么,下一行必缩进
1.分支结构
关键字:if, elif, else
1.1 单分支结构
语法格式:
if 条件:
条件成立之后要执行的代码块
age = 18 # 如果年龄小于26,称之为是小姐姐
1.2 双分支
语法格式:
if 条件:
条件成立之后执行的代码块
else:
条件不成立执行的代码块
if age < 26:
print('小姐姐好')
else:
print('不好意思,认错人了')
"""双分支结构必然会走一个分支"""
分支结构里面支持写多个条件
age = 20
height = 165
weight = 100
is_beautiful = False
if age < 26 and height >= 165 and weight <= 100 and is_beautiful:
print('小姐姐好看')
else:
print('......')
1.3 多分支
语法格式:
if 条件1:
条件1成立之后执行的代码块
elif 条件2:
条件1不成立条件2成立执行的代码块
elif 条件3:
条件1、2不成立,条件3成立执行的代码块
elif 条件4:
条件1、2、3不成立,条件4成立执行的代码块
else:
以上条件都不成立执行的代码块
练习题:
根据你的分数打印不同的等级
优秀 良好 中等 及格 不及格
score = 80
score = 88
if score >= 90:
print('优秀')
elif score >= 80:
print('良好')
elif score >= 70:
print('中等')
elif score >= 60:
print('及格')
else:
print('不及格')
2.if 嵌套语法
x = 10
if x > 0:
print("x is positive")
if x % 2 == 0:
print("x is even")
else:
print("x is odd")
else:
print("x is negative or zero")
3.循环结构
3.1 死循环
关键字:while
while True:
username = input('请输入你的用户名:')
password = input('请输入你的密码:')
if username == 'kevin' and password == '123':
print('登录成功')
else:
print('登录失败')
3.2 跳出本层循环
while True:
username = input('请输入你的用户名:')
password = input('请输入你的密码:')
if username == 'kevin' and password == '123':
print('登录成功')
break # 跳出本层循环
else:
print('登录失败')
break跳出本层循环的含义
while True:
username = input('请输入你的用户名:')
password = input('请输入你的密码:')
if username == 'kevin' and password == '123':
print('登录成功')
####### 让用户继续输入它要执行的指令,用户输入完指令之后,打印正在执行某个指令
while True:
cmd = input('请输入你要执行的指令:')
if cmd == 'q':
# 结束程序
break
print('正在执行你的指令:%s' % cmd) # 当用户输入q的时候,结束程序
break
else:
print('登录失败')
3.3 标志位的使用
flag = True
while flag:
username = input('请输入你的用户名:')
password = input('请输入你的密码:')
if username == 'kevin' and password == '123':
print('登录成功')
####### 让用户继续输入它要执行的指令,用户输入完指令之后,打印正在执行某个指令
while flag:
cmd = input('请输入你要执行的指令:')
if cmd == 'q':
# 结束程序
flag = False
print('正在执行你的指令:%s' % cmd) # 当用户输入q的时候,结束程序
else:
print('登录失败')
while+continue
1. 练习题:使用while循环打印出0-10之间的数字
count = 0
while count < 10:
print(count)
count += 1
2. 练习题:使用while循环打印出0-10之间的数字, 但是不打印6
count = 0
while count < 10:
if count == 6:
count += 1
# 不打印
continue # 跳出while循环的本次循环 --------------- 本层
print(count)
count += 1
while+else
count = 0
while count < 5:
if count == 3:
break
print(count)
count += 1
else:
print('哈哈哈')
"""else: 当while循环中没有被中断(break)的时候会走else语句"""
3.4 死循环
# 程序中坚决不能出现死循环
count = 0
while True:
print(count)
count+=1
"""如果一旦出现了死循环,CPU的利用率会极速拉满,导致其他程序也不能用,甚至于关机"""
3.5 for循环
"""for循环不会出现死循环,它的循环条件不是我们来控制,是人家内部已经控制好了"""
for循环和while循环都是用来重复一个事情的,for循环能够实现的功能,while循环都可以实现
for循环的语法结构更加简洁,它不容易出现死循环,所以,推荐以后能够使用for循环的都使用for循环
"""
可迭代对象:字符串、列表、字典、元组等,能够支持for循环的对象都是可迭代对象
for循环的语法格式:
for 变量名 in 可迭代对象:
pass
"""
'''字典暴露的是字典的key'''
d = {'username': 'jerry', 'age': 18}
for i in d:
print(i, d[i]) # username age
4. range关键字
### 三种用法
1. 方式1
for i in range(10): # 生成一个从0开始到9的数字
print(i)
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
print(i)
2. 方式2
for i in range(3, 10): # 生成一个从3开始到9的数字列表
print(i)
3. 方式三
for i in range(0, 250, 25): # 第三个参数代表的是步长
print(i)
"""练习题:使用for循环生成这10页的地址"""
https://movie.douban.com/top250?start=0&filter= # 第一页
https://movie.douban.com/top250?start=25&filter= # 第二页
https://movie.douban.com/top250?start=50&filter= # 第三页
https://movie.douban.com/top250?start=75&filter= # 第四页
https://movie.douban.com/top250?start=100&filter= # 第五页
https://movie.douban.com/top250?start=225&filter= # 最后一页
base_url = 'https://movie.douban.com/top250?start=%s&filter='
for i in range(0, 2500, 25):
# print(base_url % i)
print('https://movie.douban.com/top250?start=%s&filter=' % i)
4.1 for+break
for i in range(10):
if i == 6:
break
print(i)
4.2 for+continue
for i in range(10):
if i == 6:
continue
print(i)
4.3 for+else
'''跟while循环的用法一样,中间如果有中断程序,else就不在走了'''
for i in range(10):
if i == 6:
break
print(i)
else:
print('hahh ')
4.4for循环的嵌套
for i in range(3):
for j in range(5):
print("*", end='')
print() # print()表示换行