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('用户名或密码错误')

练习题

  1. 补充代码实现
    猜数字,设定一个理想数字比如: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. 使用循环输出1-100所有整数
print('输出1-100')
n = 1
while n <= 100:
    print(n, end=' ')
    if n == 50:
        print(f'\n{n}',end=' ')
    n += 1
  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. 输出1-100内的所有偶数
print('1-100内偶数')

n = 1
while n <= 100:
    if n % 2 == 0:
        print(f'偶数-{n}')
    n += 1
  1. 输出1-100内所有奇数
print('1-100以内奇数')
n = 1
while n <= 100:
    if n % 2 == 1:
        print(f'奇数-{n}')
    n += 1
  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

总结

  1. while循环语句
  2. break和continue 关键字的作用
  3. 三种字符串格式化的方式
  4. 基本运算符(逻辑运算涉及的相关面试题)

今日作业

  1. 判断下列逻辑语句的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
  1. 求出下列逻辑语句的值
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
  1. 下列结果是什么?
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
  1. 实现用户登录系统,并且要支持连续输错之后直接退出,并且在每次输错时显示剩余错误次数(提示:使用字符串格式化)
# 实现用户登录系统,并且要支持连续输错之后直接退出,并且在每次输错时显示剩余错误次数(提示:使用字符串格式化)

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)

"""
  1. 猜年龄游戏
    要求:允许用户最多尝试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('猜错了')
		
"""
  1. 猜年龄游戏升级版
    要求:允许用户最多尝试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