day03 Python基础
课程目标:掌握Python基础中的必备语法知识
课程概要:
- 循环语句
- 字符串格式化
- 运算符(面试题)
1. 循环语句
- while循环
- for循环(后期)
while 条件:
...
...
...
print(456)
1.1 循环语句基本属于
示例1:
print('开始')
while True:
print('alex 是个小逗比')
print('结束')
输出:
开始
alex 是个小逗比
alex 是个小逗比
alex 是个小逗比
....
示例2:
print('开始')
while 1 > 2:
print('如果祖国遭受到侵犯,热血男儿当自强。')
print('结束')
输出:
开始
结束
示例3:
data = True
print('开始')
while data:
print('如果祖国遭受到侵犯,热血男儿当自强。')
print('结束')
输出:
开始
如果祖国遭受到侵犯,热血男儿当自强。
如果祖国遭受到侵犯,热血男儿当自强。
如果祖国遭受到侵犯,热血男儿当自强。
...
示例4:
print('开始')
flag = True
while flag:
print('滚滚黄河, 滔滔长江。')
flag = False
print('结束')
输出
开始
滚滚黄河, 滔滔长江。
结束
示例5:
print('开始')
num = 1
while num < 3:
print('滚滚黄河, 滔滔长江。')
num = 5
print('结束')
输出
开始
滚滚黄河, 滔滔长江。
结束
示例6:
print('开始')
num = 1
while num < 5:
print('给我生命,给我力量')
num += 1 # 相当于更新num
print('结束')
输出
开始
给我生命,给我力量
给我生命,给我力量
给我生命,给我力量
给我生命,给我力量
结束
练习题:重复3次输出我爱我的祖国
print('开始')
n = 0
while n < 3:
print('我爱我的祖国')
n += 1
print('结束')
1.2 综合小案例
请实现一个用户登录系统,如果密码错误则反复提示用户重新输入,直到输入正确,才退出。
print('开始运行路飞系统')
flag = True
while flag:
username = input('请输入用户名:')
pwd = input('请输入用户密码:')
if pwd == '123' and username == 'liuxiaowei':
print('登录成功!')
flag = False
else:
print('用户名或密码错误')
练习题
- 补充代码实现
猜数字,设定一个理想数字比如:66,一直提示用户输入数字,如果比66大,则显示猜测的结果大了;如果比66小,则显示猜测的结果小了;只有输入等于66,显示猜测结果正确,然后退出循环。
print('猜数字游戏开始!')
flag = True
try:
while flag:
num = input('请输入猜测的数字:')
num = int(num)
if num > 66:
print('大了')
elif num < 66:
print('小了')
else:
print('猜对了')
flag = False
print('游戏结束')
except:
print('请输入数字!')
- 使用循环输出1-100所有整数
print('输出1-100')
n = 1
while n <= 100:
print(n, end=' ')
if n == 50:
print(f'\n{n}',end=' ')
n += 1
- 使用循环输出 1 2 3 4 5 6 8 9 10,即10以内除7以外的整数
print('输出10以内除7之外的整数')
n = 1
while n < 10:
if n != 7:
print(n)
n += 1
- 输出1-100内的所有偶数
print('1-100内偶数')
n = 1
while n <= 100:
if n % 2 == 0:
print(f'偶数-{n}')
n += 1
- 输出1-100内所有奇数
print('1-100以内奇数')
n = 1
while n <= 100:
if n % 2 == 1:
print(f'奇数-{n}')
n += 1
- 输出1-100内的所有整数和
print('1-100整数和')
n = 1
sum = 0
while n <= 100:
sum += n
n += 1
print(f'1-100整数和:{sum}')
7.输出10-1的所有整数
print('10-1所有整数')
n = 10
while n >= 1:
print(n)
n -= 1
1.3 break
break, 用于在while循环中帮助你终止循环。
print('开始')
while True:
print('1')
break # 终止循环
print('2')
print('结束')
输出:
1
结束
通过示例来更深入理解break的应用
示例1
print('开始')
while True:
print('红旗飘飘,军号响。')
break
print('剑已出鞘, 电闪雷鸣。')
print('从来都是狭路相逢勇者胜。')
print('结束')
输出:
开始
红旗飘飘,军号响。
结束
示例2
print('开始')
i = 1
while True:
print(i)
i += 1
if i == 101:
break
print('结束')
输出:
开始
1
2
3
...
100
结束
示例3
print('开始运行系统')
while True:
user = input('请输入用户名:')
pwd = input('请输入密码:')
if user == 'liuxiaowei' and pwd == 'oldboy':
print('登录成功')
break
else:
print('用户名或密码错误,请重新登录')
print('系统结束')
输出
开始运行系统
>>> 用户名
>>> 密码
正确,登录成功
系统结束
不正确,一直循环
所以,以后写代码的时候,想要结束循环可以通过两种方式实现,即:条件判断和break关键字,两种在使用时无好坏之分,只要能实现功能就行。
1.4 continue
Continue,在循环中结束本次循环,开始下一次循环
print('开始')
while True:
print(1)
continue
print(2)
print('结束')
输出:
开始
1
1
1
1
1
1
...
示例1
print('开始')
while True:
print('红旗飘飘,军号响。')
continue
print('剑已出鞘, 电闪雷鸣。')
print('从来都是狭路相逢勇者胜。')
print('结束')
输出:
开始
红旗飘飘,军号响。
红旗飘飘,军号响。
红旗飘飘,军号响。
红旗飘飘,军号响。
...
示例2
print('开始')
i = 1
while i < 101:
if i == 7:
i += 1
continue
print(i)
i += 1
print('结束')
输出
开始
1
2
3
...
8
9
100
结束
示例3
print('开始')
i = 1
while i < 101:
if i == 7:
i += 1
continue
print(i)
i += 1
if i == 101:
break
print('结束')
输出
开始
1
2
3
...
8
9
100
结束
写在最后,对于break和continue都是放在循环语句中用于控制循环过程的,一旦遇到break就停止所有循环,一旦遇到continue 就停止本次循环,开始下次循环。
1.5 while else
当while后的条件不成立时,else中的代码就会执行。
while 条件:
代码
else:
代码
while False:
pass
else:
print(123)
num = 1
while num < 5:
print(num)
num += 1
else:
print(666)
输出
1
2
3
4
666
while True:
print(123)
break
else:
print(666)
输出
123
2. 字符串格式化
字符串格式化,使用更便捷的形式实现字符串的拼接。
2.1 %
2.1.1 基本格式化操作
name = '刘小伟'
# 占位符
text = '我叫%s,今年49岁' %'刘小伟'
text = '我叫%s,今年49岁' %name
name = '刘小伟'
age = 18
text = '我叫%s, 今年%s岁' %('刘小伟', 49)
text = '我叫%s, 今年%s岁' %(name, age)
text = '我叫%s, 今年%d岁' %(name, age)
text = text = '我叫%s, 今年%d岁' %('刘小伟', 49)
message = '%s你什么时候过来呀?Alex今天不在家' %'死鬼'
message = '%(name)s你什么时候过来呀?Alex今天不在家' %{'name':'死鬼'}
message = '%(name)s你什么时候过来呀?%(person)s今天不在家' %{'name': '死鬼', 'person': 'Alex'}
2.1.2 百分比
text = '兄弟, 这个片我已经下载了90%了,居然特么断网了。'
print(text)
text = '%s, 这个片我已经下载了90%了,居然特么断网了。' %'兄弟'
print(text)
Traceback (most recent call last):
File "/Users/liuxiaowei/PycharmProjects/路飞全栈/day03/百分号格式化.py", line 5, in <module>
text = '%s, 这个片我已经下载了90%了,居然特么断网了。' % '兄弟'
TypeError: not enough arguments for format string
90% 当作占位符了
# 解决办法
text = '%s, 这个片我已经下载了90%%了,居然特么断网了。' %'兄弟'
print(text)
一旦字符串格式化中出现百分比的显示,请一定要添加%%以实现输出%
2.2 format
text = '我叫{0}, 今年{1}岁'.format('刘小伟', 49)
print(text)
text = '我叫{0}, 今年{1}岁,真实的姓名是{0}'.format('刘小伟', 49)
print(text)
我叫刘小伟, 今年49岁,真实的姓名是刘小伟
text = '我叫{0}, 今年{1}岁,真实的姓名是{2}'.format('刘小伟', 49, '李小龙')
print(text)
我叫刘小伟, 今年49岁,真实的姓名是李小龙
text = '我叫{}, 今年49岁'.format('刘小伟')
text = '我叫{}, 今年{}岁'.format('刘小伟', 49)
text = '我叫{}, 今年{}岁, 真实姓名{}'.format('刘小伟', 49, '刘小伟')
text = '我叫{n1}, 今年49岁'.formta(n1='刘小伟')
text = '我叫{n1}, 今年{age}岁'.formta(n1='刘小伟', age=49)
text = '我叫{n1}, 今年{age}岁, 真实的姓名{n1}'.formta(n1='刘小伟', age=49)
text = '我叫{0}, 今年{1}岁'
data1 = text.format('刘小伟', 49)
data2 = text.format('Alex', 73)
text = '我叫%s, 今年%d岁'
data1 = text %('刘小伟', 49)
data2 = text %('Alex', 73)
2.3 f
到Python3.6版本,更便捷。
name = '嫂子'
action = '跑步'
text = f'{name}喜欢{action}, 跑完之后满身大汗'
name = '喵喵'
age = 19
text = f'嫂子的名字叫{name},今年{age}岁'
print(text)
text = f'嫂子的名字叫喵喵,今年{19+2}岁'
print(text)
text = f'嫂子的名字叫喵喵,今年{19+2=}岁'
print(text)
# 进制转换
v1 = '嫂子今年{22}岁'
print(v1)
v1 = f'嫂子今年{22:#b}岁' # 二进制
print(v1)
v2 = f'嫂子今年{22:#o}岁' # 八进制
print(v2)
v3 = f'嫂子今年{22:#x}岁' # 十六进制
print(v3)
输出:
嫂子今年0b10110岁
嫂子今年0o26岁
嫂子今年0x16岁
name = 'alex'
name = f'我是{name}, 我爱大铁锤'
name = f'我是{name.upper()}, 我爱大铁锤'
print(name)
3. 运算符
- 算数运算符,例如:加减乘除
运算符 | 描述 | 实例 |
+ | 加 - 两个对象相加 | a + b输出结果 30 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b输出结果 -10 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b输出结果为200 |
/ | 除 - x 除以 y | b/a输出结果为2 |
% | 取模 - 返回除法的余数 | b % a输出结果0 |
** | 幂 - 返回x的y次幂 | a ** b为10的20次方,输出结果为10000000000000000000000 |
// | 取整除 - 返回商的整数部分 | 9 // 2 输出结果为4,9.0 // 2.0 输出结果为 4.0 |
print( 9 // 2)
- 赋值运算符, 例如:变量赋值
运算符 | 描述 | 实例 |
= | 简单的赋值运算符 | 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 |
num = 1
while num < 100:
print(num)
num += 1
- 比较运算符, 例如:大于、小于
运算符 | 描述 | 实例 |
== | 等于 - 比较对象是否相等 | (a == b)返回False |
!= | 不等于 - 比较两个对象是否不相等 | (a != b)返回True |
<> | 不等于 - 比较两个对象是否不相等 | (a <> b)返回True, 这个运算符类似!= |
> | 大于 - 返回x是否大于y | (a > b)返回False |
< | 小于 - 返回x是否小于y | (a < b)返回True |
>= | 大于等于 - 返回x是否大于等于y | (a >= b)返回False |
<= | 小于等于 - 返回x是否小于等于y | (a <= b)返回True |
注意:Python3不支持<>
if 1 > 2:
pass
while 1 > 2:
pass
data = 1 == 2
- 成员运算,例如:是否包含
运算符 | 描述 | 实例 |
in | 如果在指定的序列中找到值返回True, 否则返回False | x 在y序列中,如果x在y序列中返回True |
not in | 如果在指定的序列中没有找到值返回True,否则返回False | x不在y序列中,如果x不在y序列中返回True |
v1 = 'le' in 'alex' # True/False
# 让用户输入一段文本,检测文本中是否包含敏感词
text = input('请输入内容:')
if '苍老师' in text:
print('少儿不宜')
else:
print('text')
- 逻辑运算,例如:且或非 and 、or、 not
运算符 | 描述 | 实例 |
and | 布尔’与’ - 如果x为False, x and y 返回False,否则它返回y的计算值 | (a and b)返回True |
or | 布尔’或’ - 如果x是True, 它返回True,否则返回y的计算值 | (a or b) 返回True |
not | 布尔’与’ - 如果x为True, 它返回False,如果x为False,它返回True | not(a and b)则返回False |
if username == 'alex' and pwd == '123':
pass
data = 1 > 2
if not data:
pass
3.1 运算符优先级
运算符的优先级有很多,常见的没几个,推荐你记住3个即可:
- 算数优先级大于比较运算符
if 2 + 10 > 11:
print('True')
else:
print('False')
- 比较运算符优先级大于逻辑运算符
if 1 > 2 and 2 < 10:
print('成立')
else:
print('不成立')
- 逻辑运算符内部三个优先级 not > and > or
if not 1 and 1 > 2 or 3 == 8:
print('True')
else:
print('False')
上述这3个优先级从高到低总结:加减乘除 > 比较 > not and or 。绝招:加括号
3.2 面试题
逻辑运算: and or
v1 = name == 'alxex' and pwd = '123'
# v1 = True and False
if name == 'alex' and pwd == '123':
pass
v2 = 'liuxiaowei' and 'alxex'
# 第一步:将and 前后的值转换为布尔值 True and True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于后面的值
# 所以,后面的值等于多少最终结果就是多少。 v2 = 'alex'
v3 = '' and 'alex'
# 第一步:将and 前后的值转换为布尔值 False and True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次逻辑判断取决于前面的值
# 所以,后面的值等于多少最终结果就是多少。 v3 = ''
v4 = 1 or 8
# 第一步:将or前后的值转换为布尔值 True or True
# 第二步:判断本次操作取悦于谁?由于前面的是True,所以本次结果取决于前面值
# 所以v4 =1
v5 = 0 or 8
# 第一步:将or前后的值转换为布尔值 False or True
# 第二步:判断本次操作取悦于谁?由于前面的是False,所以本次结果取决于后面值
# 所以v5 = 8
练习题
v1 = 1 or 2
v2 = -1 or 3
v3 = 0 or -1
v4 = 0 or 100
v5 = '' or 10
v6 = 'liuxiaowie' or ''
v7 = 0 or ''
print(v1, v2, v3, v4, v5, v6, v7)
# 输出
1
-1
-1
100
10
liuxiaowei
""
注意:or看第一个值是True不用看后面了,结果就是第一个值。否则结果就是第二个值
v1 = 4 and 8
v2 = 0 and 6
v3 = -1 and 88
v4 = '' and 7
v5 = 'liuxiaowei' and ''
v6 = '' and 0
v7 = 0 and '中国'
print(v1, v2 , v3, v4, v5, v6, v7)
# 输出
8
0
-1
""
liuxiaowei
0
0
注意:第一个值如果是True,结果就是第二个值,否则也是第一个值
面试题
如果多个and 和or的情况,先计算and再计算or
v1 = 0 or 4 and 3 or 7 or 9 and 6
0 or 3 or 7 or 9 and 6
0 or 3 or 7 or 6
3 or 7 or 6
3 or 6
3
v2 = 8 or 3 and 4 or 2 and 0 or 9 and 7
8 or 4 or 0 or 7
8 or 0 or 7
8 or 7
8
v3 = 0 or 2 and 3 and 4 or 6 and 0 or 3
0 or 3 and 4 or 0 or 3
0 or 4 or 0 or 3
4 or 0 or 3
4 or 3
4
# 输出
3
8
4
先计算not,再计算and,最后计算or
v4 = not 8 or 3 and 4 or 2
0 or 3 and 4 or 2
0 or 4 or 2
4 or 2
4
# 输出
4
总结
- while循环语句
- break和continue 关键字的作用
- 三种字符串格式化的方式
- 基本运算符(逻辑运算涉及的相关面试题)
今日作业
- 判断下列逻辑语句的True,False
1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
# 解体步骤, 比较运算符优先级大于逻辑运算符
# 0 代表False 1代表True
'''
0 or 1 or 0 and 1 and 1 or 0
0 or 1 or 0 and 1 or 0
0 or 1 or 0 or 0
1 or 0 or 0
'''
not 2 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6
'''
not 1 and 1 or 0 and 1 and 1 or 0
0 and 1 or 0 and 1 and 1 or 0
0 or 0 and 1 or 0
0 or 0 or 0
0
'''
# 输出
True
False
- 求出下列逻辑语句的值
8 or 3 and 4 or 2 and 0 or 9 and 7
0 or 2 and 3 and 4 or 6 and 0 or 3
# 输出
8
4
- 下列结果是什么?
6 or 2 > 1
3 or 2 > 1
0 or 5 < 4
5 < 4 or 3
2 > 1 or 6
3 and 2 > 1
0 and 3 > 1
2 > 1 and 3
3 > 1 and 0
3 > 1 and 2 or 2 < 3 and 3 and 4 or 3 > 2
# 输出
6
3
False
3
True
True
0
3
0
2
- 实现用户登录系统,并且要支持连续输错之后直接退出,并且在每次输错时显示剩余错误次数(提示:使用字符串格式化)
# 实现用户登录系统,并且要支持连续输错之后直接退出,并且在每次输错时显示剩余错误次数(提示:使用字符串格式化)
print('用户登录系统')
n = 3 # 计数次数
while True:
user = input('请输入用户名:')
pwd = input('请输入密码:')
data = user == 'liuxiaowei' and pwd == '123'
if data:
print(f'{user}登录成功!')
break
else:
n -= 1
if n > 0:
print(f'还有{n}次输入机会!')
else:
break
# 另一种方法
"""
n = 1
while n < 4:
user = input('请输入用户名:')
pwd = input('请输入密码:')
if user == 'liuxiaowei' and pwd == '123':
print('登录成功!')
break
else:
n += 1
message = f'用户名或者密码错误,剩余输入次数为{4-n}次'
print(message)
"""
- 猜年龄游戏
要求:允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出。
# 要求:允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出。
print('猜年龄游戏开始')
print('最多运行尝试3次!!!')
age = 88
n = 3
while n > 0:
num_guess = input('请输入猜测的年龄:')
if int(num_guess) > age:
print('大了')
n -= 1
elif int(num_guess) < age:
print('小了')
n -= 1
else:
print('恭喜你,猜对了!')
break
# 另一种方法
"""
n = 0
while n < 3:
n += 1
age_guess = input('请输入猜测的年龄:')
if int(age_guess) == 88:
print('恭喜你猜对了!')
else:
print('猜错了')
"""
- 猜年龄游戏升级版
要求:允许用户最多尝试3次,每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y,就继续让其猜3次,以此往复,如果回答N,就退出程序,如果猜对了,直接退出。
print('猜字游戏升级版')
num = 88
n = 3
while n > 0:
num_guess = input('请输入猜测数字:')
if int(num_guess) > 88:
print('大了')
n -= 1
elif int(num_guess) < 88:
print('小了')
n -= 1
else:
print('恭喜你,猜对了!')
break
if n == 0:
answer = input('是否继续猜数游戏?(y/n)')
if answer.lower() == 'y':
n = 3
else:
break