首页 > 技术文章 > 【Python】基础操作

blknemo 2020-09-19 18:47 原文

注释

一. 注释的作用

没有注释的代码

添加注释的代码

通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。

二. 注释的分类及语法

注释分为两类:单行注释多行注释

单行注释
只能注释一行内容,语法如下:

# 注释内容

多行注释
可以注释多行内容,一般用在注释一段代码的情况,语法如下:

"""
 第一行注释
 第二行注释
 第三行注释
"""
'''
 注释1
 注释2
 注释3
'''

快捷键: ctrl + /

2.1 快速体验

单行注释

# 输出hello world
print('hello world')
print('hello Python') # 输出(简单的说明可以放到一行代码的后面,一般习惯代码后面添加两个空格再书写注释文字)

多行注释

"""
 下面三行都是输出的作用,输出内容分别是:
 hello Python
 hello itcast
 hello itheima
"""
print('hello Python')
print('hello itcast')
print('hello itheima')
'''
 下面三行都是输出的作用,输出内容分别是:
 hello Python
 hello itcast
 hello itheima
'''
print('hello Python')
print('hello itcast')
print('hello itheima')

注意:解释器不执行任何的注释内容。

函数注解表达式

Python3提供一种语法,用于为函数声明中的参数和返回值附加元数据。下面的例子是注解后的版本,特点在第一行:

def clip(text : str, max_len : 'int > 0' = 80) -> str:
    """在max_len前面或后面的第一个空格处截断文本 
    """
    end = None
    if len(text) > max_len:
        space_before = text.rfind(' ', 0, max_len)
        if space_before >= 0
            end = space_before
        else:
            space_after = text.rfind(' ', max_len)       # 返回字符串最后一次出现的位置,没有则返回-1 
            if space_after >= 0:
                end = space_after
    if end is None:        # 没找到空格
        end = len(text)
    return text[:end].rstrip()        # 删除字符串末尾指定的字符串,默认为空格
  1. 函数声明中的各个参数可以在:后增加注解表达式。

  2. 如果参数由默认值,注解放在参数名和 = 号之间。

  3. 如果注解有返回值,在 ) 和函数末尾的:之间增加 -> 和一个表达式。那个表达式可以是任何类型。注解中最常用的类型是类(如 str 或 int)和字符串(如 'int > 0')。

注解不会做任何处理,只是存储在函数的__annotations__属性(一个字典)中:

>>> from clip_annot import clip
>>> clip._annotations__
{'text' : <class 'str'>, 'max_len' : 'int > 0', 'return' : <class 'str'>}

'return'键保存的是返回值注解,即函数声明里以 -> 标记的部分。

Python对注解所做的唯一的事情是,把他们存储在函数的__annotations__属性里。仅此而已,Python不做检查,不做强制,不做验证,什么操作都不做。换句话,注解对Python解释器没任何意义。注解只是元数据,可以供IDE、框架和装饰器等工具使用。

变量

一. 变量的作用


举例体验:我们去图书馆读书,怎么样快速找到自己想要的书籍呢?是不是管理员提前将书放到固定位置,并把这个位置进行了编号,我们只需要在图书馆中按照这个编号查找指定的位置就能找到想要的书籍。

这个编号其实就是把书籍存放的书架位置起了一个名字,方便后期查找和使用。

程序中,数据都是临时存储在内存中,为了更快速的查找或使用这个数据,通常我们把这个数据在内存中存储之后定义一个名称,这个名称就是变量。

变量就是一个存储数据的的时候当前数据所在的内存地址的名字而已。

二. 定义变量

变量名 = 值

变量名自定义,要满足标识符命名规则。

2.1 标识符

标识符命名规则是Python中定义各种名字的时候的统一规范,具体如下:

  • 由数字、字母、下划线组成
  • 不能数字开头
  • 不能使用内置关键字
  • 严格区分大小写
False None True and as assert break class 
continue def del elif else except finally for
from global if import in is lambda nonlocal
not or pass raise return try while with 
yield

2.2 命名习惯

见名知义。

  • 大驼峰:即每个单词⾸字母都大写,例如: MyName 。
  • 小驼峰:第二个(含)以后的单词⾸字母大写,例如: myName 。
  • 下划线:例如: my_name 。

2.3 使用变量

my_name = 'TOM'
print(my_name)

schoolName = '程序员'
print(schoolName)

2.4 认识bug

所谓bug,就是程序中的错误。如果程序有错误,需要程序员排查问题,纠正错误。

三. Debug工具

Debug工具是PyCharm IDE中集成的用来调试程序的工具,在这里程序员可以查看程序的执行细节和流程或者调解bug。

Debug工具使用步骤:

  1. 打断点
  2. Debug调试

3.1 打断点

  • 断点位置
    目标要调试的代码块的第一行代码即可,即一个断点即可。
  • 打断点的方法
    单击目标代码的行号右侧空白位置。

3.2 Debug调试

打成功断点后,在文件内部任意位置 — 右键 -- Debug'文件名' — 即可调出Debug工具面板 -- 单击Step Over/F8,即可按步执行代码。

3.2.1 Debug输出面板分类

  • Debugger
    显示变量和变量的细节
  • Console
    输出内容

四. 认识数据类型

在 Python 里为了应对不同的业务需求,也把数据分为不同的类型。

检测数据类型的方法: type()

a = 1
print(type(a)) # <class 'int'> -- 整型

b = 1.1
print(type(b)) # <class 'float'> -- 浮点型

c = True
print(type(c)) # <class 'bool'> -- 布尔型

d = '12345'
print(type(d)) # <class 'str'> -- 字符串

e = [10, 20, 30]
print(type(e)) # <class 'list'> -- 列表

f = (10, 20, 30)
print(type(f)) # <class 'tuple'> -- 元组

h = {10, 20, 30}
print(type(h)) # <class 'set'> -- 集合

g = {'name': 'TOM', 'age': 20}
print(type(g)) # <class 'dict'> -- 字典

输出

一. 格式化输出

所谓的格式化输出即按照一定的格式输出内容。

1.1 格式化符号

print('hello Python')

age = 18
print(age)

# 需求:输出“今年我的年龄是18岁” 123456
格式符号 转换
%s 字符串
%d 有符号的十进制整数
%f 浮点数
%c 字符
%u 无符号十进制整数
%o 八进制整数
%x 十六进制整数(小写ox)
%X 十六进制整数(大写OX)
%e 科学计数法(小写'e')
%E 科学计数法(大写'E')
%g %f和%e的简写
%G %f和%E的简写

技巧

  • %06d,表示输出的整数显示位数,不足以0补全,超出当前位数则原样输出
  • %.2f,表示小数点后显示的小数位数。

1.2 体验

格式化字符串除了%s,还可以写为 f'{表达式}'

age = 18
name = 'TOM'
weight = 75.5
student_id = 1

# 我的名字是TOM
print('我的名字是%s' % name)

# 我的学号是0001
print('我的学号是%4d' % student_id)

# 我的体重是75.50公斤
print('我的体重是%.2f公斤' % weight)

# 我的名字是TOM,今年18岁了
print('我的名字是%s,今年%d岁了' % (name, age))

# 我的名字是TOM,明年19岁了
print('我的名字是%s,明年%d岁了' % (name, age + 1))

# 我的名字是TOM,明年19岁了
print(f'我的名字是{name}, 明年{age + 1}岁了')

f-格式化字符串是Python3.6中新增的格式化方法,该方法更简单易读。

1.3 转义字符

  • \n :换行。
  • \t :制表符,一个tab键(4个空格)的距离。

1.4 结束符

想一想,为什么两个print会换行输出?

print('输出的内容', end="\n")

在Python中,print(), 默认自带 end="\n" 这个换行结束符,所以导致每两个 print 直接会换行展示,用户可以按需求更改结束符。

输入

一. 输入

在Python中,程序接收用户输入的数据的功能即是输入。

1.2 输入的语法

input("提示信息")

1.3 输入的特点

  • 当程序执行到 input,等待用户输入,输入完成之后才继续向下执行。
  • 在Python中, input 接收用户输入后,一般存储到变量,方便使用。
  • 在Python中, input 会把接收到的任意用户输入的数据都当做字符串处理。
password = input('请输入您的密码:')
print(f'您输入的密码是{password}')
# <class 'str'>
print(type(password))

控制台输出结果如下:

输入默认值

方法一:检验空字符串

python的input()函数,直接回车默认返回值是''(空字符串)。

a = input('2 + 2 = ')
if a == '':
    print(4)

方法二:or 默认值

很简单,在input()后面加 “or 默认值”就行了。

原理是这样的:如果未输入任何内容,则input将返回空字符串。python中的空字符串是False,加上or之后会检验逻辑真假,bool("")–> 假。
按你的例子:

a=input("2 + 2 = ") or "4"
print a

转换数据类型

一. 转换数据类型的作用

问:input()接收用户输入的数据都是字符串类型,如果用户输入1,想得到整型该如何操作?
答:转换数据类型即可,即将字符串类型转换成整型。

二. 转换数据类型的函数

函数 说明
int(x [,base ]) 将x转换为一个整数
float(x) 将x转换为一个浮点数
complex(real [,imag ]) 创建一个复数,real为实部,imag为虚部
str(x) 将对象 x 转换为字符串
repr(x) 将对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 将序列 s 转换为一个元组
list(s) 将序列 s 转换为一个列表
chr(x) 将一个整数转换为一个Unicode字符
ord(x) 将一个字符转换为它的ASCII整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串
bin(x) 将一个整数转换为一个二进制字符串

三. 快速体验

需求:input接收用户输入,用户输入“1”,将这个数据1转换成整型。

# 1. 接收用户输入
num = input('请输入您的幸运数字:')

# 2. 打印结果
print(f"您的幸运数字是{num}")

# 3. 检测接收到的用户输入的数据类型 -- str类型
print(type(num))

# 4. 转换数据类型为整型 -- int类型
print(type(int(num)))

四. 实验

# 1. float() -- 转换成浮点型
num1 = 1
print(float(num1))
print(type(float(num1)))

# 2. str() -- 转换成字符串类型
num2 = 10
print(type(str(num2)))

# 3. tuple() -- 将一个序列转换成元组
list1 = [10, 20, 30]
print(tuple(list1))
print(type(tuple(list1)))

# 4. list() -- 将一个序列转换成列表
t1 = (100, 200, 300)
print(list(t1))
print(type(list(t1)))

# 5. eval() -- 将字符串中的数据转换成Python表达式原本类型
str1 = '10'
str2 = '[1, 2, 3]'
str3 = '(1000, 2000, 3000)'
print(type(eval(str1)))
print(type(eval(str2)))
print(type(eval(str3)))

运算符

运算符的分类

算数运算符
赋值运算符
复合赋值运算符
比较运算符
逻辑运算符

1. 算数运算符

运算符 描述 实例
+ 1 + 1 输出结果为 2
- 1 - 1 输出结果为 0
* 2 * 2 输出结果为 4
/ 10 / 2 输出结果为 5
// 整除 9 // 4 输出结果为2 % 取余 9 % 4 输出结果为 1
** 指数 2 ** 4 输出结果为 16,即 2 * 2 * 2 * 2
() 小括号 小括号用来提高运算优先级,即 (1 + 2) * 3 输出结果为 9

注意:混合运算优先级顺序: () 高于 ** 高于 * / // % 高于 + -

2. 赋值运算符

运算符 描述 实例
= 赋值 将 = 右侧的结果赋值给等号左侧的变量

单个变量赋值

num = 1
print(num)

多个变量赋值

num1, float1, str1 = 10, 0.5, 'hello world'
print(num1)
print(float1)
print(str1)

结果如下:

多变量赋相同值

a = b = 10
print(a)
print(b)

结果如下:

3. 复合赋值运算符

运算符 描述 实例
+= 加法赋值运算符 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
a = 100
a += 1
# 输出101 a = a + 1,最终a = 100 + 1
print(a)

b = 2 
b *= 3
# 输出6 b = b * 3,最终b = 2 * 3
print(b) 

c = 10
c += 1 + 2
# 输出13, 先算运算符右侧1 + 2 = 3, c += 3 , 推导出c = 10 + 3
print(c)

4. 比较运算符

比较运算符也叫关系运算符,通常用来判断。

运算符 描述 实例
== 判断相等。如果两个操作数的结果相等,则条件结果为真(True),否则条件结果为假(False) 如a=3,b=3,则(a == b) 为 True
!= 不等于 。如果两个操作数的结果不相等,则条件为真(True),否则条件结果为假(False) 如a=3,b=3,则(a == b) 为 True
如a=1,b=3,则(a != b) 为 True
> 运算符左侧操作数结果是否大于右侧操作数结果,如果大于,则条件为真,否则为假 如a=7,b=3,则(a > b) 为 True
< 运算符左侧操作数结果是否小于右侧操作数结果,如果小于,则条件为真,否则为假 如a=7,b=3,则(a < b) 为 False
>= 运算符左侧操作数结果是否大于等于右侧操作数结果,如果大于,则条件为真,否则为假 如a=7,b=3,则(a < b) 为 False
如a=3,b=3,则(a >= b) 为 True
<= 运算符左侧操作数结果是否小于等于右侧操作数结果,如果小于,则条件为真,否则为假 如a=3,b=3,则(a <= b) 为 True
a = 7 b = 5
print(a == b) # False
print(a != b) # True
print(a < b) # False
print(a > b) # True
print(a <= b) # False
print(a >= b) # True

5. 逻辑运算符

运算符 逻辑表达式 描述 实例
and x and y 布尔"与":如果 x 为 False,x and y 返回 False,否则它返回 y 的值。 True and False,返回 False。
or x or y 布尔"或":如果 x 是 True,它返回 True,否则它返回 y 的值。 False or True, 返回 True。
not not x 布尔"非":如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not True 返回 False, not False 返回 True
a = 1 
b = 2 
c = 3

print((a < b) and (b < c)) # True
print((a > b) and (b < c)) # False
print((a > b) or (b < c)) # True
print(not (a > b)) # True

5.1 拓展
数字之间的逻辑运算

a = 0 
b = 1 
c = 2

# and运算符,只要有一个值为0,则结果为0,否则结果为最后一个非0数字
print(a and b) # 0
print(b and a) # 0
print(a and c) # 0
print(c and a) # 0
print(b and c) # 2
print(c and b) # 1

# or运算符,只有所有值为0结果才为0,否则结果为第一个非0数字
print(a or b) # 1
print(a or c) # 2
print(b or c) # 1

条件语句

一. 了解条件语句

假设一个场景:

  • 同学们这个年龄去过网吧吗?
  • 去网吧进门想要上网必须做的一件事是做什么?(考虑重点)
  • 为什么要把身份证给工作人员?
  • 是不是就是为了判断是否成年?
  • 是不是如果成年可以上网?如果不成年则不允许上网?

其实这里所谓的判断就是条件语句,即条件成立执行某些代码,条件不成立则不执行这些代码。

二. if 语法

2.1 语法

if 条件:
    条件成立执行的代码1
    条件成立执行的代码2
    ......

2.2 快速体验

if True:
    print('条件成立执行的代码1')
    print('条件成立执行的代码2')
# 下方的代码没有缩进到if语句块,所以和if条件无关
print('我是无论条件是否成立都要执行的代码')

执行结果如下:

三. 实例:上网

需求分析:如果用户年龄大于等于18岁,即成年,输出"已经成年,可以上网"。

3.1 简单版

age = 20
if age >= 18:
    print('已经成年,可以上网')

print('系统关闭')

3.2 进阶版

新增需求:用户可以输出自己的年龄,然后系统进行判断是否成年,成年则输出"您的年龄是'用户输入的年龄',已经成年,可以上网"。

# input接受用户输入的数据是字符串类型,条件是age和整型18做判断,所以这里要int转换数据类型
age = int(input('请输入您的年龄:'))

if age >= 18:
    print(f'您的年龄是{age},已经成年,可以上网')

print('系统关闭')

四. if...else...

作用:条件成立执行if下方的代码; 条件不成立执行else下方的代码。

思考:网吧上网的实例,如果成年,允许上网,如果不成年呢?是不是应该回复用户不能上网?

4.1 语法

if 条件:
    条件成立执行的代码1
    条件成立执行的代码2
    ......
else:
    条件不成立执行的代码1
    条件不成立执行的代码2
    ......

4.2 实用版:网吧上网

age = int(input('请输入您的年龄:'))

if age >= 18:
    print(f'您的年龄是{age},已经成年,可以上网')
else:
    print(f'您的年龄是{age},未成年,请自行回家写作业')

print('系统关闭')

注意:如果某些条件成立执行了相关的代码,那么其他的情况的代码解释器根本不会执行。

五、多重判断

思考:中国合法工作年龄为18-60岁,即如果年龄小于18的情况为童工,不合法;如果年龄在18-60岁之间为合法工龄;大于60岁为法定退休年龄。

5.1 语法

if 条件1:
    条件1成立执行的代码1
    条件1成立执行的代码2
    ......
elif 条件2:
    条件2成立执行的代码1
    条件2成立执行的代码2
    ......
......
else:
    以上条件都不成立执行执行的代码

多重判断也可以和else配合使用。一般else放到整个if语句的最后,表示以上条件都不成立的时候执行的代码。

5.2 实例:工龄判断

age = int(input('请输入您的年龄:'))
if age < 18:
    print(f'您的年龄是{age},童工一枚')
elif age >= 18 and age <= 60:
    print(f'您的年龄是{age},合法工龄')
elif age > 60:
    print(f'您的年龄是{age},可以退休')

拓展: age >= 18 and age <= 60 可以化简为 18 <= age <= 60 。

六、if嵌套

思考:坐公交:如果有钱可以上车,没钱不能上车;上车后如果有空座,则可以坐下;如果没空座,就要站着。怎么书写程序?

6.1 语法

if 条件1:
    条件1成立执行的代码
    条件1成立执行的代码
 
    if 条件2:
        条件2成立执行的代码
        条件2成立执行的代码

注意:条件2的if也是出于条件1的缩进关系内部。

6.2 实例:坐公交

6.2.1 判断是否能上车

"""
1. 如果有钱,则可以上车
    2. 上车后,如果有空座,可以坐下
    上车后,如果没有空座,则站着等空座位
如果没钱,不能上车
"""
# 假设用 money = 1 表示有钱, money = 0表示没有钱
money = 1
if money == 1:
    print('土豪,不差钱,顺利上车')
else:
    print('没钱,不能上车,追着公交车跑')

6.2.2 判断是否能坐下

"""
1. 如果有钱,则可以上车
    2. 上车后,如果有空座,可以坐下
    上车后,如果没有空座,则站着等空座位
如果没钱,不能上车
"""
# 假设用 money = 1 表示有钱, money = 0表示没有钱; seat = 1 表示有空座,seat = 0 表示
没有空座
money = 1
seat = 0
if money == 1:
    print('土豪,不差钱,顺利上车')
    if seat == 1:
        print('有空座,可以坐下')
    else:
    print('没有空座,站等')
else:
    print('没钱,不能上车,追着公交车跑')

6.3 if嵌套执行流程

七. 应用:猜拳游戏

需求分析:

  • 参与游戏的⻆色
    • 玩家
      • 手动出拳
    • 电脑
      • 随机出拳
  • 判断输赢
    • 玩家获胜
玩家 电脑
石头 剪刀
剪刀
石头
  • 平局
    • 玩家出拳 和 电脑出拳相同
  • 电脑获胜

随机做法:

  1. 导出random模块

    import 模块名
  2. 使用random模块中的随机整数功能

    random.randint(开始,结束)
"""
提示:0-石头,1-剪刀,2-布
1. 出拳
玩家输入出拳
电脑随机出拳
2. 判断输赢
玩家获胜
平局
电脑获胜
"""
# 导入random模块
import random

# 计算电脑出拳的随机数字
computer = random.randint(0, 2)
print(computer)

player = int(input('请出拳:0-石头,1-剪刀,2-布:'))

# 玩家胜利 p0:c1 或 p1:c2 或 p2:c0
if ((player == 0) and (computer == 1) or ((player == 1) and (computer == 2) or ((player == 2) and (computer == 0)):
    print('玩家获胜')

# 平局:玩家 == 电脑
elif player == computer:
    print('平局')
else:
    print('电脑获胜')

八. 三目运算符(一行if判断)

三目运算符也叫三元运算符或三元表达式。

语法如下:

条件成立执行的表达式 if 条件 else 条件不成立执行的表达式

快速体验:

a = 1 
b = 2

c = a if a > b else b
print(c)

循环

一. 循环简介

1.1 循环的作用

思考:假如我有个女朋友,有一天我们闹矛盾生气了,女朋友说:道歉,说100遍“媳妇儿,我错了”。这个时候程序员会怎么做?
答:100遍 print('媳妇儿,我错了')

思考:复制粘贴100次吗?
答:重复执行100次一样的代码,程序中循环即可循环的作用:让代码更高效的重复执行。

1.2 循环的分类

在Python中,循环分为 while 和 for 两种,最终实现效果相同。

二. while的语法

2.1 快速体验

需求:复现重复执行100次 print('媳妇儿,我错了') (输出更简洁一些,我们这里设置5次)。

while 条件:
    条件成立重复执行的代码1
    条件成立重复执行的代码2
    ......

分析:初始值是0次,终点是5次,重复做的事情输出“媳妇儿,我错了”。

# 循环的计数器
i = 0
while i < 5:
    print('媳妇儿,我错了')
    i += 1

print('任务结束')

三. while的应用

3.1 应用一:计算1-100累加和

分析:1-100的累加和,即1 + 2 + 3 + 4 +….,即前两个数字的相加结果 + 下一个数字( 前一个数字 + 1)。

i = 1
result = 0
while i <= 100:
    result += i
    i += 1
# 输出5050
print(result)

注意:为了验证程序的准确性,可以先改小数值,验证结果正确后,再改成1-100做累加。

3.2 应用二:计算1-100偶数累加和

分析:1-100的偶数和,即 2 + 4 + 6 + 8....,得到偶数的方法如下:

  • 偶数即是和2取余结果为0的数字,可以加入条件语句判断是否为偶数,为偶数则累加
  • 初始值为0 / 2 , 计数器每次累加2

3.2.1 方法一:条件判断和2取余数则累加

# 方法一:条件判断和2取余数为0则累加计算
i = 1
result = 0
while i <= 100:
    if i % 2 == 0:
        result += i
    i += 1

# 输出2550
print(result)

3.2.2 方法二:计数器控制

# 方法二:计数器控制增量为2 i = 0
result = 0
while i <= 100:
    result += i
    i += 2

# 输出2550
print(result)

四、break和continue

break和continue是循环中满足一定条件退出循环的两种不同方式。

4.1 理解

举例:一共吃5个苹果,吃完第一个,吃第二个…,这里"吃苹果"的动作是不是重复执行?
情况一:如果吃的过程中,吃完第三个吃饱了,则不需要再吃第4个和第五个苹果,即是吃苹果的动作停止,这里就是break控制循环流程,即终止此循环。
情况二:如果吃的过程中,吃到第三个吃出一个大虫子...,是不是这个苹果就不吃了,开始吃第四个苹果,这里就是continue控制循环流程,即退出当前一次循环继而执行下一次循环代码。

4.1.1 情况一:break

i = 1
while i <= 5:
    if i == 4:
        print(f'吃饱了不吃了')
        break
    print(f'吃了第{i}个苹果')
    i += 1

执行结果:

4.1.2 情况二:continue

i = 1
while i <= 5:
    if i == 3:
    print(f'大虫子,第{i}个不吃了')
    # 在continue之前一定要修改计数器,否则会陷入死循环
    i += 1
    continue
    print(f'吃了第{i}个苹果')
    i += 1

执行结果:

五. while循环嵌套

5.1 应用场景

故事梗概:有天女朋友又生气了,惩罚:说3遍“媳妇儿, 我错了”,这个程序是不是循环即可?但如果女朋友说:还要刷今天晚饭的碗,这个程序怎么书写?

while 条件:
    print('媳妇儿, 我错了')
print('刷晚饭的碗')

但如果女朋友还是生气,把这套惩罚要连续3天都执行,有如何书写程序?

while 条件:
    while 条件:
        print('媳妇儿, 我错了')
    print('刷晚饭的碗')

5.2 语法

while 条件1:
    条件1成立执行的代码
    ......
    while 条件2:
        条件2成立执行的代码
        ......

总结:所谓while循环嵌套,就是一个while里面嵌套一个while的写法,每个while和之前的基础语法是相同的。

5.3 快速体验:复现场景

5.3.1 代码

j = 0
while j < 3:
    i = 0
    while i < 3:
        print('媳妇儿,我错了')
        i += 1
    print('刷晚饭的碗')
    print('一套惩罚结束----------------')
    j += 1

5.3.2 执行结果

5.3.3 理解执行流程

当内部循环执行完成之后,再执行下一次外部循环的条件判断。

六. while循环嵌套应用

6.1 应用一:打印星号(正方形)

6.1.1 需求

*****
*****
*****
*****
*****

6.1.2 代码

分析:一行输出5个星号,重复打印5行

# 重复打印5行星星
j = 0
while j <= 4:
    # 一行星星的打印
    i = 0
    while i <= 4:
        # 一行内的星星不能换行,取消print默认结束符\n
        print('*', end='')
        i += 1
    # 每行结束要换行,这里借助一个空的print,利用print默认结束符换行
    print()
    j += 1

6.2 应用二:打印星号(三⻆形)

6.2.1 需求

*
**
***
****
*****

6.2.2 代码

分析:一行输出星星的个数和行号是相等的,每行:重复打印行号数字个星号,将打印行星号的命令重复执行5次实现打印5行。

# 重复打印5行星星
# j表示行号
j = 0
while j <= 4:
    # 一行星星的打印
    i = 0
    # i表示每行里面星星的个数,这个数字要和行号相等所以i要和j联动
    while i <= j:
        print('*', end='')
        i += 1
    print()
    j += 1

6.3 九九乘法表

6.3.1 执行结果

6.3.2 代码

# 重复打印9行表达式
j = 1
while j <= 9:
    # 打印一行里面的表达式 a * b = a*b
    i = 1
    while i <= j:
        print(f'{i}*{j}={j*i}', end='\t')
        i += 1
    print()
    j += 1

七、for循环

一行for循环

一行for循环可用于生成一个生成器

a=[i for i in range(0,5) if i>2]
print(a)
#[3, 4]

7.1 语法

for 临时变量 in 序列:
 重复执行的代码1
 重复执行的代码2
 ......

7.2 快速体验

str1 = 'itheima'
for i in str1:
    print(i)

执行结果:

7.3 break

str1 = 'itheima'
for i in str1:
    if i == 'e':
        print('遇到e不打印')
        break
    print(i)

执行结果:

7.4 continue

str1 = 'itheima'
for i in str1:
    if i == 'e':
        print('遇到e不打印')
        continue
    print(i)

执行结果:

常用函数any()all()

any():对列表中的所有元素进行判断,看是否有任意一个满足条件。用于判断给定的可迭代参数是否全部为 False,是则返回 False,如果有一个为 True,则返回 True。

diffNum += 1 if any(mssimv[i] < 0.95 for i in range(3)) else 0

all():对列表中的所有元素进行判断,看是否有全部满足条件

八. else

循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码。

8.1 while...else

需求:女朋友生气了,要惩罚:连续说5遍“媳妇儿,我错了”,如果道歉正常完毕女朋友就原谅我了,这个程序怎么写?

i = 1
while i <= 5:
 print('媳妇儿,我错了')
 i += 1
print('媳妇儿原谅我了...')

思考: 这个print是不是没有循环也能执行?

8.1.1 语法

while 条件:
    条件成立重复执行的代码
else:
    循环正常结束之后要执行的代码

8.1.2 示例

i = 1
while i <= 5:
    print('媳妇儿,我错了')
    i += 1
else:
    print('媳妇原谅我了,真开心,哈哈哈哈')

8.1.3 退出循环的方式

需求:女朋友生气,要求道歉5遍:媳妇儿,我错了。道歉到第三遍的时候,媳妇埋怨这一遍说的不真诚,是不是就是要退出循环了?这个退出有两种可能性:

  • 更生气,不打算原谅,也不需要道歉了,程序如何书写?
  • 只一遍不真诚,可以忍受,继续下一遍道歉,程序如何书写?
  1. break

    i = 1
    while i <= 5:
        if i == 3:
            print('这遍说的不真诚')
            break
        print('媳妇儿,我错了')
        i += 1
    else:
        print('媳妇原谅我了,真开心,哈哈哈哈')


    所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

  2. continue
    i = 1 while i <= 5: if i == 3: print('这遍说的不真诚') i += 1 continue print('媳妇儿,我错了') i += 1 else: print('媳妇原谅我了,真开心,哈哈哈哈')

    因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

8.2 for...else

8.2.1 语法

for 临时变量 in 序列:
    重复执行的代码
    ...
else:
    循环正常结束之后要执行的代码

所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。

8.2.2 示例

str1 = 'itheima'
for i in str1:
    print(i)
else:
    print('循环正常结束之后执行的代码')

8.2.3 退出循环的方式

  1. break终止循环

    str1 = 'itheima'
    for i in str1:
        if i == 'e':
            print('遇到e不打印')
            break
        print(i)
    else:
        print('循环正常结束之后执行的代码')

执行结果:

没有执行else缩进的代码。

  1. continue控制循环

    str1 = 'itheima'
    for i in str1:
        if i == 'e':
            print('遇到e不打印')
            continue
        print(i)
    else:
        print('循环正常结束之后执行的代码')

    执行结果:

    因为continue是退出当前一次循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码。

字符串

一. 认识字符串

字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。

a = 'hello world'
b = "abcdefg"
print(type(a))
print(type(b))

注意:控制台显示结果为 <class 'str'> , 即数据类型为str(字符串)。

1.1 字符串特征

一对引号字符串

name1 = 'Tom'
name2 = "Rose"

三引号字符串

name3 = ''' Tom '''
name4 = """ Rose """
a = ''' i am Tom,
 nice to meet you! '''
b = """ i am Rose,
 nice to meet you! """

注意:三引号形式的字符串支持换行。

思考:如果创建一个字符串 I'm Tom ?

c = "I'm Tom"
d = 'I\'m Tom'

1.2 字符串输出

print('hello world')

name = 'Tom'
print('我的名字是%s' % name)
print(f'我的名字是{name}')

1.3 字符串输入

在Python中,使用 input() 接收用户输入。

代码

name = input('请输入您的名字:')
print(f'您输入的名字是{name}')
print(type(name))

password = input('请输入您的密码:')
print(f'您输入的密码是{password}')
print(type(password))

输出结果

字符串标识符

1、字符串前加 u(unicode)

例子:

u"字符串中有中文"

含义:

前缀u表示该字符串是unicode编码,Python2中用,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码。另外一般要在文件开关标明编码方式采用utf8。

Python3中,所有字符串默认都是unicode字符串。

2、字符串前加 r(raw)

例子:

r"\n\t"

含义:

在普通字符串中,反斜线是转义符,代表一些特殊的内容,如换行符\n。

前缀r表示该字符串是原始字符串,即\不是转义符,只是单纯的一个符号。

常用于特殊的字符如换行符、正则表达式、文件路径。

注意不能在原始字符串结尾输入反斜线,否则Python不知道这是一个字符还是换行符(字符串最后用\表示换行),会报错:

SyntaxError: EOL while scanning string literal

那如果是一个文件夹路径就是以\结尾怎么办呢,可以再接一个转义\的字符串:

>>>print r'C:\Program File\my\path''\\'
C:\Program File\my\path\

3、字符串前加 b(byte)

例子:

b'<h1>Hello World!</h1>'

含义:

前缀b表示该字符串是bytes类型。只能去注释由ASCII码组成的字符串,即 不支持字符串中包含中文。
通用方法使用bytes('xxx', encoding='utf-8')进行转换。

用在Python3中,Python3里默认的str是unicode类。Python2的str本身就是bytes类,所以可不用。

常用在如网络编程中,服务器和浏览器只认bytes类型数据。如:send 函数的参数和 recv 函数的返回值都是 bytes 类型。

在 Python3 中,bytes 和 str 的互相转换方式是

str.encode('utf-8')
bytes.decode('utf-8')

4、字符串前加 f(format)

例子:

>>> account = 'Nemo'
>>> month = '30'
>>> f'我是:{account},已经连续发文{int(month) * 5}天啦!'
'我是:Nemo,已经连续发文150天啦!'

含义:

Python3.6新加特性,前缀f用来格式化字符串。可以看出f前缀可以更方便的格式化字符串,比format()方法可读性高且使用方便。

而且加上f前缀后,支持在大括号内,运行Python表达式。

你还可以用fr前缀来表示原生字符串。

二、下标

“下标” 又叫 “索引” ,就是编号。比如⽕车座位号,座位号的作用:按照编号快速找到对应的座位。同理,下标的作用即是通过下标快速找到对应的数据。

2.1 快速体验

需求:字符串 name = "abcdef" ,取到不同下标对应的数据。

代码

name = "abcdef"
print(name[1])
print(name[0])
print(name[2])

输出结果

注意:下标从0开始。

三、切片

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。

3.1 语法

序列[开始位置下标:结束位置下标:步长]

注意

  1. 不包含结束位置下标对应的数据, 正负整数均可;
  2. 步长是选取间隔,正负整数均可,默认步长为1。

3.2 体验

name = "abcdefg"
print(name[2:5:1]) # cde
print(name[2:5]) # cde
print(name[:5]) # abcde
print(name[1:]) # bcdefg
print(name[:]) # abcdefg
print(name[::2]) # aceg
print(name[:-1]) # abcdef, 负1表示倒数第一个数据
print(name[-4:-1]) # def
print(name[::-1]) # gfedcba

四、常用操作方法

字符串的常用操作方法有查找、修改和判断三大类。

4.1 查找

所谓字符串查找方法即是查找子串在字符串中的位置或出现的次数。

find():检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则则返回-1。

  1. 语法

    字符串序列.find(子串, 开始位置下标, 结束位置下标)

    注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  2. 快速体验

    mystr = "hello world and itcast and itheima and Python"
    
    print(mystr.find('and')) # 12
    print(mystr.find('and', 15, 30)) # 23
    print(mystr.find('ands')) # -1

index():检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则则报异常。

  1. 语法

    字符串序列.index(子串, 开始位置下标, 结束位置下标)

    注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  2. 快速体验

    mystr = "hello world and itcast and itheima and Python"
    print(mystr.index('and')) # 12
    print(mystr.index('and', 15, 30)) # 23
    print(mystr.index('ands')) # 报错

rfind(): 和find()功能相同,但查找方向为右侧开始。
rindex():和index()功能相同,但查找方向为右侧开始。
count():返回某个子串在字符串中出现的次数

  1. 语法

    字符串序列.count(子串, 开始位置下标, 结束位置下标)

    注意:开始和结束位置下标可以省略,表示在整个字符串序列中查找。

  2. 快速体验

    mystr = "hello world and itcast and itheima and Python"
    print(mystr.count('and')) # 3
    print(mystr.count('ands')) # 0
    print(mystr.count('and', 0, 20)) # 1

4.2 修改

所谓修改字符串,指的就是通过函数的形式修改字符串中的数据。

replace():替换

  1. 语法

    字符串序列.replace(旧子串, 新子串, 替换次数)

    注意:替换次数如果查出子串出现次数,则替换次数为该子串出现次数。

  2. 快速体验

    mystr = "hello world and itcast and itheima and Python"
    # 结果:hello world he itcast he itheima he Python
    print(mystr.replace('and', 'he'))
    # 结果:hello world he itcast he itheima he Python
    print(mystr.replace('and', 'he', 10))
    # 结果:hello world and itcast and itheima and Python
    print(mystr)

    注意:数据按照是否能直接修改分为可变类型和不可变类型两种。字符串类型的数据修改的时候不能改变原有字符串,属于不能直接修改数据的类型即是不可变类型。

split():按照指定字符分割字符串。

  1. 语法

    字符串序列.split(分割字符, num)

    注意:num表示的是分割字符出现的次数,即将来返回数据个数为num+1个。

  2. 快速体验

    mystr = "hello world and itcast and itheima and Python"
    # 结果:['hello world ', ' itcast ', ' itheima ', ' Python']
    print(mystr.split('and'))
    # 结果:['hello world ', ' itcast ', ' itheima and Python']
    print(mystr.split('and', 2))
    # 结果:['hello', 'world', 'and', 'itcast', 'and', 'itheima', 'and', 'Python']
    print(mystr.split(' '))
    # 结果:['hello', 'world', 'and itcast and itheima and Python']
    print(mystr.split(' ', 2))

    注意:如果分割字符是原有字符串中的子串,分割后则丢失该子串。

join():用一个字符或子串合并字符串,即是将多个字符串合并为一个新的字符串。

  1. 语法

    字符或子串.join(多字符串组成的序列)
  2. 快速体验

    list1 = ['chuan', 'zhi', 'bo', 'ke']
    t1 = ('aa', 'b', 'cc', 'ddd')
    # 结果:chuan_zhi_bo_ke
    print('_'.join(list1))
    # 结果:aa...b...cc...ddd
    print('...'.join(t1))

capitalize():将字符串第一个字符转换成大写。

mystr = "hello world and itcast and itheima and Python"

# 结果:Hello world and itcast and itheima and python
print(mystr.capitalize())

注意:capitalize()函数转换后,只字符串第一个字符大写,其他的字符全都小写。

title():将字符串每个单词⾸字母转换成大写。

mystr = "hello world and itcast and itheima and Python"

# 结果:Hello World And Itcast And Itheima And Python
print(mystr.title())

lower():将字符串中大写转小写。

mystr = "hello world and itcast and itheima and Python"

# 结果:hello world and itcast and itheima and python
print(mystr.lower())

upper():将字符串中小写转大写。

mystr = "hello world and itcast and itheima and Python"

# 结果:HELLO WORLD AND ITCAST AND ITHEIMA AND PYTHON
print(mystr.upper())

lstrip():删除字符串左侧空白字符。

mystr = "    hello world an itcast and itheima and Pathon    "

# 结果:'hello world an itcast and itheima and Pathon    '
mystr.lstrip()

rstrip():删除字符串右侧空白字符。

mystr = "    hello world an itcast and itheima and Pathon    "

# 结果:'    hello world an itcast and itheima and Pathon'
mystr.rstrip()

strip():删除字符串两侧空白字符。

mystr = "    hello world an itcast and itheima and Pathon    "

# 结果:'hello world an itcast and itheima and Pathon'
mystr.strip()

ljust():返回一个原字符串左对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串。

  1. 语法

    字符串序列.ljust(长度, 填充字符)
  2. 输出效果

    mystr = 'hello'
    
    # 结果'hello.....'
    mystr.ljust(10, '.')
    
    # 结果'hello     '
    mystr.ljust(10)

rjust():返回一个原字符串右对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串,语法和ljust()相同。

center():返回一个原字符串居中对齐,并使用指定字符(默认空格)填充至对应长度 的新字符串,语法和ljust()相同。

mystr = 'hello'

# 结果'  hello   '
mystr.center(10)

# 结果'..hello...'
mystr.center(10, '.')

4.3 判断

所谓判断即是判断真假,返回的结果是布尔型数据类型:True 或 False。

startswith():检查字符串是否是以指定子串开头,是则返回 True,否则返回 False。如果设置开
始和结束位置下标,则在指定范围内检查。

  1. 语法

    字符串序列.startswith(子串, 开始位置下标, 结束位置下标)
  2. 快速体验

    mystr = "hello world and itcast and itheima and Python "
    # 结果:True
    print(mystr.startswith('hello'))
    # 结果False
    print(mystr.startswith('hello', 5, 20))

endswith():检查字符串是否是以指定子串结尾,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。

  1. 语法

    字符串序列.endswith(子串, 开始位置下标, 结束位置下标)
  2. 快速体验

    mystr = "hello world and itcast and itheima and Python"
    # 结果:True
    print(mystr.endswith('Python'))
    # 结果:False
    print(mystr.endswith('python'))
    # 结果:False
    print(mystr.endswith('Python', 2, 20))

isalpha():如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False。

mystr1 = 'hello'
mystr2 = 'hello12345'

# 结果:True
print(mystr1.isalpha())

# 结果:False
print(mystr2.isalpha())

isdigit():如果字符串只包含数字则返回 True 否则返回 False。

mystr1 = 'aaa12345'
mystr2 = '12345'
# 结果: False
print(mystr1.isdigit())
# 结果:True
print(mystr2.isdigit())

isalnum():如果字符串至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。

mystr1 = 'aaa12345'
mystr2 = '12345-'
# 结果:True
print(mystr1.isalnum())
# 结果:False
print(mystr2.isalnum())

isspace():如果字符串中只包含空白,则返回 True,否则返回 False。

mystr1 = '1 2 3 4 5'
mystr2 = ' '

# 结果:False
print(mystr1.isspace())

# 结果:True
print(mystr2.isspace())

列表

一. 列表的应用场景

思考:有一个人的姓名(TOM)怎么书写存储程序?
答:变量。

思考:如果一个班级100位学生,每个人的姓名都要存储,应该如何书写程序?声明100个变量吗?
答:列表即可, 列表一次性可以存储多个数据。

二. 列表的格式

理解:可以看到使用中括号,其实就是数学的矩阵

[数据1, 数据2, 数据3, 数据4......]

列表可以一次性存储多个数据,且可以为不同数据类型。

三. 列表的常用操作

列表的作用是一次性存储多个数据,程序员可以对这些数据进行的操作有:增、删、改、查。

3.1 查找

3.1.1 下标

name_list = ['Tom', 'Lily', 'Rose']

print(name_list[0]) # Tom
print(name_list[1]) # Lily
print(name_list[2]) # Rose

3.1.2 函数

index():返回指定数据所在位置的下标 。

  1. 语法

    列表序列.index(数据, 开始位置下标, 结束位置下标)
  2. 快速体验

    name_list = ['Tom', 'Lily', 'Rose']
    print(name_list.index('Lily', 0, 2)) 

    注意:如果查找的数据不存在则报错。

count():统计指定数据在当前列表中出现的次数。

name_list = ['Tom', 'Lily', 'Rose']
print(name_list.count('Lily')) # 1

len():访问列表长度,即列表中数据的个数。

name_list = ['Tom', 'Lily', 'Rose']
print(len(name_list)) # 3

3.1.3 判断是否存在

in:判断指定数据在某个列表序列,如果在返回True,否则返回False

name_list = ['Tom', 'Lily', 'Rose']

# 结果:True
print('Lily' in name_list)

# 结果:False
print('Lilys' in name_list)

not in:判断指定数据不在某个列表序列,如果不在返回True,否则返回False

name_list = ['Tom', 'Lily', 'Rose']
# 结果:False
print('Lily' not in name_list)
# 结果:True
print('Lilys' not in name_list) 

体验案例
需求:查找用户输入的名字是否已经存在。

name_list = ['Tom', 'Lily', 'Rose']
name = input('请输入您要搜索的名字:')
if name in name_list:
    print(f'您输入的名字是{name}, 名字已经存在')
else:
    print(f'您输入的名字是{name}, 名字不存在')

3.2 增加

作用:增加指定数据到列表中。

append():列表结尾追加数据。

  1. 语法

    列表序列.append(数据)
  2. 体验

    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.append('xiaoming')
    
    # 结果:['Tom', 'Lily', 'Rose', 'xiaoming']
    print(name_list)

    列表追加数据的时候,直接在原列表里面追加了指定数据,即修改了原列表,故列表为可变类型数据。

  3. 注意点
    如果append()追加的数据是一个序列,则追加整个序列到列表

    name_list = ['Tom', 'Lily', 'Rose']
    name_list.append(['xiaoming', 'xiaohong'])
    # 结果:['Tom', 'Lily', 'Rose', ['xiaoming', 'xiaohong']]
    print(name_list)

extend():列表结尾追加数据,如果数据是一个序列,则将这个序列的数据逐一添加到列表。

  1. 语法

    列表序列.extend(数据)
  2. 快速体验

2.1 单个数据

name_list = ['Tom', 'Lily', 'Rose']
name_list.extend('xiaoming')
# 结果:['Tom', 'Lily', 'Rose', 'x', 'i', 'a', 'o', 'm', 'i', 'n', 'g']
print(name_list)

2.2 序列数据

name_list = ['Tom', 'Lily', 'Rose']
name_list.extend(['xiaoming', 'xiaohong'])
# 结果:['Tom', 'Lily', 'Rose', 'xiaoming', 'xiaohong']
print(name_list)

insert():指定位置新增数据。

  1. 语法

    列表序列.insert(位置下标, 数据)
  2. 快速体验

    name_list = ['Tom', 'Lily', 'Rose']
    name_list.insert(1, 'xiaoming')
    # 结果:['Tom', 'xiaoming', 'Lily', 'Rose']
    print(name_list)

3.3 删除

del

  1. 语法

    del 目标
  2. 快速体验

2.1 删除列表

name_list = ['Tom', 'Lily', 'Rose']

# 结果:报错提示:name 'name_list' is not defined
del name_list
print(name_list)

2.2 删除指定数据

name_list = ['Tom', 'Lily', 'Rose']

del name_list[0]

# 结果:['Lily', 'Rose']
print(name_list)

pop():删除指定下标的数据(默认为最后一个),并返回该数据。

  1. 语法

    列表序列.pop(下标)
  2. 快速体验

    name_list = ['Tom', 'Lily', 'Rose']
    
    del_name = name_list.pop(1)
    
    # 结果:Lily
    print(del_name)
    
    # 结果:['Tom', 'Rose']
    print(name_list)

remove():移除列表中某个数据的第一个匹配项。

  1. 语法

    列表序列.remove(数据)
  2. 快速体验

    name_list = ['Tom', 'Lily', 'Rose']
    
    name_list.remove('Rose')
    
    # 结果:['Tom', 'Lily']
    print(name_list)

clear():清空列表

name_list = ['Tom', 'Lily', 'Rose']
name_list.clear()
print(name_list) # 结果: []

3.4 修改

修改指定下标数据

name_list = ['Tom', 'Lily', 'Rose']

name_list[0] = 'aaa'

# 结果:['aaa', 'Lily', 'Rose']
print(name_list)

逆置:reverse()

num_list = [1, 5, 2, 3, 6, 8]

num_list.reverse()

# 结果:[8, 6, 3, 2, 5, 1]
print(num_list)

排序:sort()

  1. 语法

    列表序列.sort(key=None, reverse=False)

    注意:reverse表示排序规则,reverse = True 降序, reverse = False 升序(默认)

  2. 快速体验

    num_list = [1, 5, 2, 3, 6, 8]
    
    num_list.sort()
    
    # 结果:[1, 2, 3, 5, 6, 8]
    print(num_list)

3.5 复制

函数:copy()

name_list = ['Tom', 'Lily', 'Rose']

name_li2 = name_list.copy()

# 结果:['Tom', 'Lily', 'Rose']
print(name_li2)

四. 列表的循环遍历

需求:依次打印列表中的各个数据。

4.1 while

代码

name_list = ['Tom', 'Lily', 'Rose'] 

i = 0
while i < len(name_list):
    print(name_list[i])
    i += 1

执行结果

4.2 for

代码

name_list = ['Tom', 'Lily', 'Rose']

for i in name_list:
    print(i)

执行结果

五. 列表嵌套

所谓列表嵌套指的就是一个列表里面包含了其他的子列表。

应用场景:要存储班级一、二、三三个班级学生姓名,且每个班级的学生姓名在一个列表。

name_list = [['小明', '小红', '小绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]

思考: 如何查找到数据"李四"?

# 第一步:按下标查找到李四所在的列表
print(name_list[2])
# 第二步:从李四所在的列表里面,再按下标找到数据李四
print(name_list[2][1])
123451 [数据1, 数据2, 数据3]
name_list = [['小明', '小红', '小绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]
name_list[2][1]

六. 综合应用 -- 随机分配办公室

需求:有三个办公室,8位⽼师,8位⽼师随机分配到3个办公室

七. 总结

列表的格式

[数据1, 数据2, 数据3]

常用操作方法

  • index()
  • len()
  • append()
  • pop()
  • remove()

列表嵌套

name_list = [['⼩明', '⼩红', '⼩绿'], ['Tom', 'Lily', 'Rose'], ['张三', '李四', '王五']]
name_list[2][1]

元组

一. 元组的应用场景

思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做?
答:列表?列表可以一次性存储多个数据,但是列表中的数据允许更改。

num_list = [10, 20, 30]
num_list[0] = 100

一个元组可以存储多个数据,元组内的数据是不能修改的。

二. 定义元组

元组特点:定义元组使用小括号,且逗号隔开各个数据,数据可以是不同的数据类型。

理解:可以看到使用小括号,其实就是数学的向量

# 多个数据元组
t1 = (10, 20, 30)
# 单个数据元组
t2 = (10,)

注意:如果定义的元组只有一个数据,那么这个数据后面也好添加逗号,否则数据类型为唯一的这个数据的数据类型

t2 = (10,)
print(type(t2)) # tuple
t3 = (20)
print(type(t3)) # int
t4 = ('hello')
print(type(t4)) # str

三. 元组的常见操作

元组数据不支持修改,只支持查找,具体如下:

按下标查找数据

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1[0]) # aa

index():查找某个数据,如果数据存在返回对应的下标,否则报错,语法和列表、字符串的index方法相同。

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1.index('aa')) # 0

count():统计某个数据在当前元组出现的次数。

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(tuple1.count('bb')) # 2

len():统计元组中数据的个数。

tuple1 = ('aa', 'bb', 'cc', 'bb')
print(len(tuple1)) # 4

注意:元组内的直接数据如果修改则立即报错

tuple1 = ('aa', 'bb', 'cc', 'bb')
tuple1[0] = 'aaa'

但是如果元组里面有列表,修改列表里面的数据则是支持的,故自觉很重要。

tuple2 = (10, 20, ['aa', 'bb', 'cc'], 50, 30)
print(tuple2[2]) # 访问到列表

# 结果:(10, 20, ['aaaaa', 'bb', 'cc'], 50, 30)
tuple2[2][0] = 'aaaaa'
print(tuple2)

集合

一. 创建集合

创建集合使用 {} 或 set() , 但是如果要创建空集合只能使用 set() ,因为 {} 用来创建空字典。

理解:可以看到使用大括号,其实就是数学的集合

s1 = {10, 20, 30, 40, 50}
print(s1)
s2 = {10, 30, 20, 10, 30, 40, 30, 50}
print(s2)
s3 = set('abcdefg')
print(s3)
s4 = set()
print(type(s4)) # set
s5 = {}
print(type(s5)) # dict

特点:

  1. 集合可以去掉重复数据;
  2. 集合数据是无序的,故不支持下标

二. 集合常见操作方法

2.1 增加数据

add()

s1 = {10, 20}
s1.add(100)
s1.add(10)
print(s1) # {100, 10, 20}

因为集合有去重功能,所以,当向集合内追加的数据是当前集合已有数据的话,则不进行任何操作。

update(), 追加的数据是序列。

s1 = {10, 20}
# s1.update(100) # 报错
s1.update([100, 200])
s1.update('abc')
print(s1)

2.2 删除数据

remove(),删除集合中的指定数据,如果数据不存在则报错。

s1 = {10, 20}

s1.remove(10)
print(s1)

s1.remove(10) # 报错
print(s1)

discard(),删除集合中的指定数据,如果数据不存在也不会报错。

s1 = {10, 20}

s1.discard(10)
print(s1)

s1.discard(10)
print(s1)

pop(),随机删除集合中的某个数据,并返回这个数据。

s1 = {10, 20, 30, 40, 50}
del_num = s1.pop()
print(del_num)
print(s1)

2.3 查找数据

in:判断数据在集合序列

not in:判断数据不在集合序列

s1 = {10, 20, 30, 40, 50}

print(10 in s1)
print(10 not in s1)

字典

一. 字典的应用场景

思考1: 如果有多个数据,例如:'Tom', '男', 20,如何快速存储?
答:列表

list1 = ['Tom', '男', 20]

思考2:如何查找到数据'Tom'?
答:查找到下标为0的数据即可。

list1[0]

思考3:如果将来数据顺序发生变化,如下所示,还能用 list1[0] 访问到数据'Tom'吗?。
答:不能,数据'Tom'此时下标为2。

list1 = ['男', 20, 'Tom']

思考4:数据顺序发生变化,每个数据的下标也会随之变化,如何保证数据顺序变化前后能使用同一的标准查找数据呢?
答:字典,字典里面的数据是以键值对形式出现,字典数据和数据顺序没有关系,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找数据即可。

二. 创建字典的语法

字典特点:

  • 符号为大括号
  • 数据为键值对形式出现
  • 各个键值对之间用逗号隔开
# 有数据字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

# 空字典
dict2 = {}

dict3 = dict()

注意:一般称冒号前面的为键(key),简称k;冒号后面的为值(value),简称v。

三. 字典常见操作

3.1 增

写法:字典序列[key] = 值

注意:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

dict1['name'] = 'Rose'
# 结果:{'name': 'Rose', 'age': 20, 'gender': '男'}
print(dict1)

dict1['id'] = 110

# {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}
print(dict1)

注意:字典为可变类型。

3.2 删

del() / del:删除字典或删除字典中指定键值对。

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

del dict1['gender']
# 结果:{'name': 'Tom', 'age': 20}
print(dict1)

clear():清空字典

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

dict1.clear()
print(dict1) # {}

3.3 改

写法:字典序列[key] = 值

注意:如果key存在则修改这个key对应的值 ;如果key不存在则新增此键值对。

3.4 查

3.4.1 key值查找

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1['name']) # Tom
print(dict1['id']) # 报错

如果当前查找的key存在,则返回对应的值;否则则报错。

3.4.2 get()

语法

字典序列.get(key, 默认值)

注意:如果当前查找的key不存在则返回第二个参数(默认值),如果省略第二个参数,则返回 None。

快速体验

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.get('name')) # Tom
print(dict1.get('id', 110)) # 110
print(dict1.get('id')) # None

3.4.3 keys()

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.keys()) # dict_keys(['name', 'age', 'gender'])

3.4.4 values()

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.values()) # dict_values(['Tom', 20, '男'])

3.4.5 items()

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.items()) # dict_items([('name', 'Tom'), ('age', 20), ('gender','男')])

四. 字典的循环遍历

4.1 遍历字典的key

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key in dict1.keys():
    print(key) 

4.2 遍历字典的value

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for value in dict1.values():
    print(value)

4.3 遍历字典的元素

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for item in dict1.items():
    print(item)

4.4 遍历字典的键值对

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key, value in dict1.items():
    print(f'{key} = {value}')

公共操作

一. 运算符

运算符 描述 支持的容器类型
+ 合并 字符串、列表、元组
* 复制 字符串、列表、元组
in 元素是否存在 字符串、列表、元组、字典
not in 元素是否不存在 字符串、列表、元组、字典

1.1 +

# 1. 字符串
str1 = 'aa'
str2 = 'bb'
str3 = str1 + str2
print(str3) # aabb

# 2. 列表
list1 = [1, 2]
list2 = [10, 20]
list3 = list1 + list2
print(list3) # [1, 2, 10, 20]

# 3. 元组
t1 = (1, 2)
t2 = (10, 20)
t3 = t1 + t2
print(t3) # (10, 20, 100, 200)

1.2 *

# 1. 字符串
print('-' * 10) # ----------

# 2. 列表
list1 = ['hello']
print(list1 * 4) # ['hello', 'hello', 'hello', 'hello']

# 3. 元组
t1 = ('world',)
print(t1 * 4) # ('world', 'world', 'world', 'world')

1.3 in或not in

# 1. 字符串
print('a' in 'abcd') # True
print('a' not in 'abcd') # False

# 2. 列表
list1 = ['a', 'b', 'c', 'd']
print('a' in list1) # True
print('a' not in list1) # False

# 3. 元组
t1 = ('a', 'b', 'c', 'd')
print('aa' in t1) # False
print('aa' not in t1) # True

二. 公共方法

函数 描述
len() 计算容器中元素个数
del 或 del() 删除
max() 返回容器中元素最大值
min() 返回容器中元素最小值
range(start, end, step) 生成从start到end的数字,步长为 step,供for循环使用
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

2.1 len()

# 1. 字符串
str1 = 'abcdefg'
print(len(str1)) # 7

# 2. 列表
list1 = [10, 20, 30, 40]
print(len(list1)) # 4

# 3. 元组
t1 = (10, 20, 30, 40, 50)
print(len(t1)) # 5

# 4. 集合
s1 = {10, 20, 30}
print(len(s1)) # 3

# 5. 字典
dict1 = {'name': 'Rose', 'age': 18}
print(len(dict1)) # 2

2.2 del()

# 1. 字符串
str1 = 'abcdefg'
del str1
print(str1)

# 2. 列表
list1 = [10, 20, 30, 40]
del(list1[0])
print(list1) # [20, 30, 40]

2.3 max()

# 1. 字符串
str1 = 'abcdefg'
print(max(str1)) # g

# 2. 列表
list1 = [10, 20, 30, 40]
print(max(list1)) # 40

2.4 min()

# 1. 字符串
str1 = 'abcdefg'
print(min(str1)) # a
# 2. 列表
list1 = [10, 20, 30, 40]
print(min(list1)) # 10

2.5 range()

# 1 2 3 4 5 6 7 8 9
for i in range(1, 10, 1):
    print(i)
# 1 3 5 7 9
for i in range(1, 10, 2):
    print(i)
# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
    print(i)

注意:range()生成的序列不包含end数字。

2.6 enumerate()

语法

enumerate(可遍历对象, start=0)

注意:start参数用来设置遍历数据的下标的起始值,默认为0。

快速体验

list1 = ['a', 'b', 'c', 'd', 'e']

for i in enumerate(list1):
    print(i)

for index, char in enumerate(list1, start=1):
    print(f'下标是{index}, 对应的字符是{char}')

三. 容器类型转换

3.1 tuple()

作用:将某个序列转换成元组

list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}

print(tuple(list1))
print(tuple(s1))

3.2 list()

作用:将某个序列转换成列表

t1 = ('a', 'b', 'c', 'd', 'e')
s1 = {100, 200, 300, 400, 500}

print(list(t1))
print(list(s1))

3.3 set()
作用:将某个序列转换成集合

list1 = [10, 20, 30, 40, 50, 20]
t1 = ('a', 'b', 'c', 'd', 'e')
print(set(list1))
print(set(t1))

注意:

  1. 集合可以快速完成列表去重
  2. 集合不支持下标

推导式

一. 列表推导式

作用:用一个表达式创建一个有规律的列表或控制一个有规律列表。
列表推导式又叫列表生成式。

1.1 快速体验

需求:创建一个0-10的列表。

while循环实现

# 1. 准备一个空列表
list1 = []

# 2. 书写循环,依次追加数字到空列表list1中 i = 0
while i < 10:
    list1.append(i)
    i += 1

print(list1)

for循环实现

list1 = []
for i in range(10):
    list1.append(i)

print(list1)

列表推导式实现

list1 = [i for i in range(10)]
print(list1)

1.2 带if的列表推导式

需求:创建0-10的偶数列表

方法一:range()步长实现

list1 = [i for i in range(0, 10, 2)]
print(list1)

方法二:if实现

list1 = [i for i in range(10) if i % 2 == 0]
print(list1)

1.3 多个for循环实现列表推导式

需求:创建列表如下:

[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

代码如下:

list1 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list1)

二. 字典推导式

思考:如果有如下两个列表:

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

如何快速合并为一个字典?
答:字典推导式
字典推导式作用:快速合并列表为字典或提取字典中目标数据。

2.1 快速体验

  1. 创建一个字典:字典key是1-5数字,value是这个数字的2次方。
dict1 = {i: i**2 for i in range(1, 5)}
print(dict1) # {1: 1, 2: 4, 3: 9, 4: 16}
  1. 将两个列表合并为一个字典
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)
  1. 提取字典中目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}

# 需求:提取上述电脑数量大于等于200的字典数据
count1 = {key: value for key, value in counts.items() if value >= 200}
print(count1) # {'MBP': 268, 'DELL': 201}

三. 集合推导式

需求:创建一个集合,数据为下方列表的2次方。

list1 = [1, 1, 2]

代码如下:

list1 = [1, 1, 2]
set1 = {i ** 2 for i in list1}
print(set1) # {1, 4}

注意:集合有数据去重功能。

推荐阅读