python视频学习笔记5(高级变量的类型 字符串 列表 元组 字典 )
知识点回顾:
Python 中数据类型可以分为 **数字型** 和 **非数字型**
* 数字型
* 整型 (`int`)
* 浮点型(`float`)
* 布尔型(`bool`)
* 真 `True` `非 0 数` —— **非零即真**
* 假 `False` `0`
* 复数型 (`complex`)
* 主要用于科学计算,例如:平面场问题、波动问题、电感电容等问题
* 非数字型
* 字符串
* 列表
* 元组
* 字典
* 在 `Python` 中,所有 **非数字型变量** 都支持以下特点:
1. 都是一个 **序列** `sequence`,也可以理解为 **容器**
2. **取值** `[]`
3. **遍历** `for in`
4. **计算长度**、**最大/最小值**、**比较**、**删除**
5. **链接** `+` 和 **重复** `*`
6. **切片**
本章学习大纲:
一。列表 list
1.列表的定义
* 列表用 `[]` 定义,**数据** 之间使用 `,` 分隔
* 列表的 **索引** 从 `0` 开始
注意:从列表中取值时,如果 **超出索引范围**,程序会报错
name_list = ["zhangsan", "lisi", "wangwu"]
2.列表的常用操作
* 输入 `name_list.` 按下 `TAB` 键,`ipython` 会提示 **列表** 能够使用的 **方法** 如下:
| 序号 | 分类 | 关键字 / 函数 / 方法 | 说明 |
| --- | --- | --- | --- |
| 1 | 增加 | 列表.insert(索引, 数据) | 在指定位置插入数据 |
| | | 列表.append(数据) | 在末尾追加数据
| | | 列表.extend(列表2) | 将列表2 的数据追加到列表 |
| 2 | 修改 | 列表[索引] = 数据 | 修改指定索引的数据 |
| 3 | 删除 | del 列表[索引] | 删除指定索引的数据 |
| | | 列表.remove[数据] | 删除第一个出现的指定数据 |
| | | 列表.pop | 删除末尾数据 |
| | | 列表.pop(索引) | 删除指定索引数据 |
| | | 列表.clear | 清空列表 |
| 4 | 统计 | len(列表) | 列表长度 |
| | | 列表.count(数据) | 数据在列表中出现的次数 |
| 5 | 排序 | 列表.sort() | 升序排序 |
| | | 列表.sort(reverse=True) | 降序排序 |
| | | 列表.reverse() | 逆序、反转 |
注意:del不是方法是,关键字,和remove区别在于
* `del` 关键字本质上是用来 **将一个变量从内存中删除的**
* 如果使用 `del` 关键字将变量从内存中删除,后续的代码就不能再使用这个变量了
3.各种操作:
sort 和reverse用法
4.关键字、函数和方法的区别是什么?
关键字:
比如 if for,while等,是 Python 内置的、具有特殊意义的标识符。
关键字后面不需要使用括号
函数:
函数** 封装了独立功能,可以直接调用
格式:函数名(参数)
方法:
*方法** 需要通过 **对象** 来调用,表示针对这个 **对象** 要做的操作
对象.方法名(参数)
5.循环遍历
**遍历** 就是 **从头到尾** **依次** 从 **列表** 中获取数据
* 在 **循环体内部** 针对 **每一个元素**,执行相同的操作
使用 `for` 就能够实现迭代遍历
语法:
# for 循环内部使用的变量 in 列表
for name in name_list:
循环内部针对列表元素进行操作
print(name)
6.列表的嵌套
练习题1:
要求:
一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配
练习题2 :
# 编程实现对一个元素全为数字的列表,求最大值、最小值
方法一:每次都将大的值赋给mymax,多次循环后则得出最大值;但是这个只能针对mylist大于0的情况,如果小于0则无法得出,所以看方法二
方法二:改良后,不和0比,和第一个值比较,将比他大的赋值与它
二。元组Tuple
1.元组的定义
Tuple`(元组)与列表类似,不同之处在于元组的 **元素不能修改**(里面的数据不可以改变就用元组,要不然用列表)
元组的 **索引** 从 `0` 开始
* **索引** 就是数据在 **元组** 中的位置编号
2.能够使用的函数:
```python
info.count info.index (和列表同样)
不能修改,所以没有修改函数
```
3.循环遍历
> * 在 `Python` 中,可以使用 `for` 循环遍历所有非数字型类型的变量:**列表**、**元组**、**字典** 以及 **字符串**
格式化字符串和数组的配合使用
* **让列表不可以被修改**,以保护数据安全
4.元组和列表之间的转换
* 使用 `list` 函数可以把元组转换成列表
```python
list(元组)
```
* 使用 `tuple` 函数可以把列表转换成元组
```python
tuple(列表)
三。字典 dict
1.字典的定义
通常用于存储 **描述一个 `物体` 的相关信息**
* 和列表的区别
* **列表** 是 **有序** 的对象集合
* **字典** 是 **无序** 的对象集合,可变
yinlili = {"name":"yll",
"age":18,
"gender":True,
"height":1.65}
# 键值 的名字不能重复(才能完成1对1 通过一个key 获取key 的value)
# 字典的key 一般都是使用字符串
# 字典的value 没有规定 (可以重复的)
2.字典常用操作
In [1]: xiaoming.
xiaoming.clear xiaoming.items xiaoming.setdefault
xiaoming.copy xiaoming.keys xiaoming.update
xiaoming.fromkeys xiaoming.pop xiaoming.values
xiaoming.get xiaoming.popitem
3.循环遍历
遍历** 就是 **依次** 从 **字典** 中获取所有键值对
语法和列表元组不同:
print("%s: %s" % (k, xiaoming[k]))
4。实际场景下-----将 **多个字典** 放在 **一个列表** 中
```python
card_list = [{"name": "张三",
"qq": "12345",
"phone": "110"},
{"name": "李四",
"qq": "54321",
"phone": "10086"}
]
```
四。字符串
2.字符串遍历
```python
string = "Hello Python"
for c in string:
print(c)
```
3.常用方法
In [1]: hello_str.
hello_str.capitalize hello_str.isidentifier hello_str.rindex
hello_str.casefold hello_str.islower hello_str.rjust
hello_str.center hello_str.isnumeric hello_str.rpartition
hello_str.count hello_str.isprintable hello_str.rsplit
hello_str.encode hello_str.isspace hello_str.rstrip
hello_str.endswith hello_str.istitle hello_str.split
hello_str.expandtabs hello_str.isupper hello_str.splitlines
hello_str.find hello_str.join hello_str.startswith
hello_str.format hello_str.ljust hello_str.strip
hello_str.format_map hello_str.lower hello_str.swapcase
hello_str.index hello_str.lstrip hello_str.title
hello_str.isalnum hello_str.maketrans hello_str.translate
hello_str.isalpha hello_str.partition hello_str.upper
hello_str.isdecimal hello_str.replace hello_str.zfill
hello_str.isdigit hello_str.rfind
#### 1) 判断类型 - 9
| 方法 | 说明 |
| --- | --- |
| string.isspace() | 如果 string 中只包含空格,则返回 True |
| string.isalnum() | 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True |
| string.isalpha() | 如果 string 至少有一个字符并且所有字符都是字母则返回 True |
| string.isdecimal() | 如果 string 只包含数字则返回 True,`全角数字` |
| string.isdigit() | 如果 string 只包含数字则返回 True,`全角数字`、`⑴`、`\u00b2` |
| string.isnumeric() | 如果 string 只包含数字则返回 True,`全角数字`,`汉字数字` |
| string.istitle() | 如果 string 是标题化的(每个单词的首字母大写)则返回 True |
| string.islower() | 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True |
| string.isupper() | 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True |
#### 2) 查找和替换 - 7
| 方法 | 说明 |
| --- | --- |
| string.startswith(str) | 检查字符串是否是以 str 开头,是则返回 True |
| string.endswith(str) | 检查字符串是否是以 str 结束,是则返回 True |
| string.find(str, start=0, end=len(string)) | 检测 str 是否包含在 string 中,如果 start 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回 `-1` |
| string.rfind(str, start=0, end=len(string)) | 类似于 find(),不过是从右边开始查找 |
| string.index(str, start=0, end=len(string)) | 跟 find() 方法类似,不过如果 str 不在 string 会报错 |
| string.rindex(str, start=0, end=len(string)) | 类似于 index(),不过是从右边开始 |
| string.replace(old_str, new_str, num=string.count(old)) | 把 string 中的 old_str 替换成 new_str,如果 num 指定,则替换不超过 num 次 |
#### 3) 大小写转换 - 5
| 方法 | 说明 |
| --- | --- |
| string.capitalize() | 把字符串的第一个字符大写 |
| string.title() | 把字符串的每个单词首字母大写 |
| string.lower() | 转换 string 中所有大写字符为小写 |
| string.upper() | 转换 string 中的小写字母为大写 |
| string.swapcase() | 翻转 string 中的大小写 |
#### 4) 文本对齐 - 3
| 方法 | 说明 |
| --- | --- |
| string.ljust(width) | 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 |
| string.rjust(width) | 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 |
| string.center(width) | 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 |
#### 5) 去除空白字符 - 3
| 方法 | 说明 |
| --- | --- |
| string.lstrip() | 截掉 string 左边(开始)的空白字符 |
| string.rstrip() | 截掉 string 右边(末尾)的空白字符 |
| string.strip() | 截掉 string 左右两边的空白字符 |
#### 6) 拆分和连接 - 5
| 方法 | 说明 |
| --- | --- |
| string.partition(str) | 把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面) |
| string.rpartition(str) | 类似于 partition() 方法,不过是从右边开始查找 |
| string.split(str="", num) | 以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串,str 默认包含 '\r', '\t', '\n' 和空格 |
| string.splitlines() | 按照行('\r', '\n', '\r\n')分隔,返回一个包含各行作为元素的列表 |
| string.join(seq) | 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 |
练习如下:
4.字符串切片
**切片** 方法适用于 **字符串**、**列表**、**元组**
* **切片** 使用 **索引值** 来限定范围,从一个大的 **字符串** 中 **切出** 小的 **字符串**
* **列表** 和 **元组** 都是 **有序** 的集合,都能够 **通过索引值** 获取到对应的数据
* **字典** 是一个 **无序** 的集合,是使用 **键值对** 保存数据
```
字符串[开始索引:结束索引:步长]
```
**注意**:
1. 指定的区间属于 **左闭右开** 型 `[开始索引, 结束索引)` => `开始索引 >= 范围 < 结束索引`
* 从 `起始` 位开始,到 **`结束`位的前一位** 结束(**不包含结束位本身**)
2. 从头开始,**开始索引** **数字可以省略,冒号不能省略**
3. 到末尾结束,**结束索引** **数字可以省略,冒号不能省略**
4. 步长默认为 `1`,如果连续切片,**数字和冒号都可以省略**
#### 索引的顺序和倒序
* 在 Python 中不仅支持 **顺序索引**,同时还支持 **倒序索引**
* 所谓倒序索引就是 **从右向左** 计算索引
* 最右边的索引值是 **-1**,依次递减
五。公共方法(针对字符串,列表,元组,字典都可以使用)
1.内置函数
Python 包含了以下内置函数:
| 函数 | 描述 | 备注 |
| --- | --- | --- |
| len(item) | 计算容器中元素个数 | |
| del(item) | 删除变量 | del 有两种方式 |
| max(item) | 返回容器中元素最大值 | 如果是字典,只针对 key 比较 |
| min(item) | 返回容器中元素最小值 | 如果是字典,只针对 key 比较 |
| cmp(item1, item2) | 比较两个值,-1 小于/0 相等/1 大于 | Python 3.x 取消了 cmp 函数 |
**注意**
* **字符串** 比较符合以下规则: "0" < "A" < "a"
2.切片
| 描述 | Python 表达式 | 结果 | 支持的数据类型 |
| :---: | --- | --- | --- | --- |
| 切片 | "0123456789"[::-2] | "97531" | 字符串、列表、元组 |
* **切片** 使用 **索引值** 来限定范围,从一个大的 **字符串** 中 **切出** 小的 **字符串**
* **列表** 和 **元组** 都是 **有序** 的集合,都能够 **通过索引值** 获取到对应的数据
* **字典** 是一个 **无序** 的集合,是使用 **键值对** 保存数据
3.运算符
| 运算符 | Python 表达式 | 结果 | 描述 | 支持的数据类型 |
| :---: | --- | --- | --- | --- |
| + | [1, 2] + [3, 4] | [1, 2, 3, 4] | 合并 | 字符串、列表、元组 |
| * | ["Hi!"] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 重复 | 字符串、列表、元组 |
| in | 3 in (1, 2, 3) | True | 元素是否存在 | 字符串、列表、元组、字典 |
| not in | 4 not in (1, 2, 3) | True | 元素是否不存在 | 字符串、列表、元组、字典 |
| > >= == < <= | (1, 2, 3) < (2, 2, 3) | True | 元素比较 | 字符串、列表、元组 |
**注意**
* `in` 在对 **字典** 操作时,判断的是 **字典的键**
* `in` 和 `not in` 被称为 **成员运算符**
#### 成员运算符
成员运算符用于 **测试** 序列中是否包含指定的 **成员**
| 运算符 | 描述 | 实例 |
| --- | --- | --- |
| in | 如果在指定的序列中找到值返回 True,否则返回 False | `3 in (1, 2, 3)` 返回 `True` |
| not in | 如果在指定的序列中没有找到值返回 True,否则返回 False | `3 not in (1, 2, 3)` 返回 `False` |
注意:在对 **字典** 操作时,判断的是 **字典的键**
4.完整的for 循环语法 for else语法使用
``````python
for 变量 in 集合:
循环体代码 (进行遍历)
if
break #如果找到直接退出循环,不再继续遍历
else: (一般是上面的for循环中未搜索到,最后统一给出提示)没有通过 break 退出循环,循环结束后,会执行的代码
``````
加个if的条件
#### 应用场景
* 在 **迭代遍历** 嵌套的数据类型时,例如 **一个列表包含了多个字典**
* 需求:要判断 某一个字典中 是否存在 指定的 值
* 如果 **存在**,提示并且退出循环
* 如果 **不存在**,在 **循环整体结束** 后,希望 **得到一个统一的提示**
问题:搜索班上某个同学的详细信息
方法如下
遍历 :for循环+字典;
寻找:if ==;
找到退出不再遍历:break(否则继续输出其他信息);
else(都找不到)
如果else和if并列,先遍历阿土,走一遍if ,else,再遍历小美再走一遍if else,这不是我们想 要的
如果else放在外面和for平齐,则所有的遍历结束后再统一使用一次else即可,
5. 可以遍历的 字符串 列表 元组 字典 -> for循环总结
-----------------------------------
# 可以遍历的 字符串 列表 元组 字典 -> for循环
# 自定义一个字符串
my_name = "hello"
for c in my_name:
print(c)
# 自定义一个列表 快速创建一个有规律的列表
my_list = list("abcd")
for value in my_list:
print(value)
# 自定义一个元组
my_tuple = tuple("123456")
for value in my_tuple:
print(value)
# 定义一个字典
my_dict = {"name": "小红", "age": 22, "no": "009"}
# 遍历-key
for key in my_dict.keys():
print(key)
# 遍历value
for value in my_dict.values():
print(value)
# 遍历items
for item in my_dict.items():
print(item[0])
print(item[1])
# 上面的方法不方便,可以通过设置两个临时变量
for key, value in my_dict.items():
print("key:", key)
print("value:", value)
# 如果想获取元素和下标索引 请使用enumerate(列表名)
# 定义一个列表
my_list = list("abcd")
# 不仅要获取列表中的元素 而且需要知道这个元素下标索引
for i, value in enumerate(my_list):
print(i,value)
------------------------------------------
结果:
h
e
l
l
o
a
b
c
d
1
2
3
4
5
6
name
age
no
小红
22
009
name
小红
age
22
no
009
key: name
value: 小红
key: age
value: 22
key: no
value: 009
0 a
1 b
2 c
3 d
6.公共方法的总结用法
------------------------------------
import random
# 开区间闭区间
# 随机数
# [x, y]
# random.randint(x, y)
# 范围
# [x, y)
# range(x, y)
# 切片 -> 字符串中
# [x, y)
# "a"[x:y:步长]
# 数据类型 是可变 还是不可变
# 不可变的
# int float bool str 元组
# 可变的
# 列表 字典
# 公共方法--------------------------------
# 运算符 +
# 列表
# 注意顺序
my_list1 = [1, 2]
my_list2 = [3, 5]
ret1 = my_list2 + my_list1
print(ret1)
# 字符串
name = "小明"
# 占位符
print("我叫%s" % name)
ret = "我叫" + name
ret1 = "我叫%s" % name
print(ret1)
# 加入下面是类型不统一 使用str()转类型
name = "小明"
age = 18
ret2 = "我叫" + name + "年龄" + str(age)
print(ret2)
# 元组
ret3 = (1, 4) + (6, 9)
print(ret3)
# 运算符 *
# 字符串
my_str = "=="*20
print(my_str)
# 列表
my_list = ["hello", "world"]*10
print(my_list)
# 元组
my_tuple = (11,)*5
print(my_tuple)
# in
my_name = "world"
if "l" in my_name:
print("存在")
# 元组
my_tuple = (1, 3, 5)
if 1 in my_tuple:
print("存在")
# 字典
my_dict = {"name": "小红", "age": 22, "no": "009"}
# 使用in 在字典中其实是判断的是key存不存在
if "name" in my_dict:
print("存在")
# 就是想查看值到底有没有
if "小红" in my_dict.values():
print("存在")
# del用法总结
# 可以配合列表使用
my_list = [1, 2, 3]
del my_list[1]
# 可以配合字典
my_dict = {"name": "小红", "age": 22, "no": "009"}
del my_dict["age"]
# 可以提前销毁一个对象
num = 10
# 在程序没有结束的时候 程序员提前杀死了这个对象 提前释放内存
# 此时执行下面del后,会提示NameError: name 'num' is not defined
del num
print(num)
#
# input()
# 监听当程序结束后 python会执行一个方法 del num 告知系统回收内存
------------------------------------------------
执行结果如下:
[3, 5, 1, 2]
我叫小明
我叫小明
我叫小明年龄18
(1, 4, 6, 9)
========================================
['hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world', 'hello', 'world']
(11, 11, 11, 11, 11)
存在
存在
存在
存在
Traceback (most recent call last):
File "C:/Users/a000027/PycharmProjects/高级变量/06-公共方法和总结.py", line 95, in <module>
print(num)
NameError: name 'num' is not defined
实例1:求字符串的个数(除去空格和重复)
下面代码中:”为什么要定义空列表mylist,为了不重复展示同样的字母(去重),每次添加一个已经计算过的放进这个列表后打印出来
实例2:坐地铁累计花多少钱?
--------------------------------------------------------------------------------------------
# 轨道交通价格调整为:
# 6公里(含)内3元;
# 6公里至12公里(含)4元;
# 12公里至22公里(含)5元;
# 22公里至32公里(含)6元;
# 32公里以上部分,每增加1元可乘坐20公里。
# 定义一个变量 模拟出行的公里数(后面需要按照出行情况来输入)
km = 15
# 定义一个变量保存单程票价(这个变量后面不需要人工输入,是用来保存的,这个值会变)
every_money = 0
# 判断
# 6公里(含)内3元;
if km > 0 and km <= 6:
every_money = 3
# 6公里至12公里(含)4元;
elif km > 6 and km <= 12:
every_money = 4
# 12公里至22公里(含)5元;
elif km > 12 and km <= 22:
every_money = 5
# 22公里至32公里(含)6元;
elif km > 22 and km <= 32:
every_money = 6
# 32公里以上部分,每增加1元可乘坐20公里。
elif km > 32:
# 分析: 假设 乘坐了50公里则换算成 (32 + 18) -> 6 + 1=7元
# 分析: 假设 52 (32 +20) -> 6 + 1
# 分析: 假设 53 (32 + 20 + 1) -> 6 + 1 + 1
# 从假设看出,需要定义一个变量 求公里数的差值,看他是否被20整除
temp_km = km - 32
# 分两种情况 temp_km是否可以被20整除
# 整除了
if temp_km % 20 == 0:
# 32公里以内的 加上超出的
every_money = 6 + temp_km / 20
else:
# int去掉小数部分
every_money = 6 + int(temp_km/20) + 1
print("当成票价:%d" % every_money)
# 使用市政交通一卡通刷卡乘坐轨道交通,
# 每自然月内每张卡支出累计满100元以后的乘次,价格给予8折优惠;
# 满150元以后的乘次,价格给予5折优惠;
# 支出累计达到400元以后的乘次,不再享受打折优惠。
# 假设每个月,小明都需要上20天班,每次上班需要来回1次,即每天需要乘坐2次同样路线的地铁
# 最终得出这"20"天小明做地铁消费多少钱?(20天 40个来回)
# 下面定义一个变量 用来保存总的消费金额
total_money = 0
# 循环模拟40次,第一次5块钱。第二次5+5.第三次10+5,最后累计
for i in range(40):
# 判断小明消费的金额
if total_money < 100:
total_money += every_money
# # 每自然月内每张卡支出累计满100元以后的乘次,价格给予8折优惠;
elif total_money >= 100 and total_money < 150:
total_money += every_money * 0.8
# 满150元以后的乘次,价格给予5折优惠;
elif total_money >= 150 and total_money < 400:
total_money += every_money * 0.5
# 支出累计达到400元以后的乘次,不再享受打折优惠。
elif total_money >= 400:
total_money += every_money
print("小明这个月消费%.2f" % total_money)
---------------------------------------------
每次修改变量后得到的结果是:
当成票价:5
小明这个月消费169.50