现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
面向对象基础
面向对象-继承
面向对象-其他
异常
模块和包
包
注释
–
-
注释的分类
-
单行:
# 注释内容
,快捷键ctrl+/ -
多行:
""" 注释内容 """
或''' 注释内容 '''
-
解释器不执行注释内容
注释分为两类:单行注释 和 多行注释。
- 单行注释
只能注释一行内容,语法如下:
注释内容
- 多行注释
可以注释多行内容,一般用在注释一段代码的情况, 语法如下:
“”"
第一行注释
第二行注释
第三行注释
“”"
‘’’
注释1
注释2
注释3
‘’’
快捷键: ctrl + /
变量
–
变量就是一个存储数据的的时候当前数据所在的内存地址的名字而已。
标识符
标识符命名规则是Python中定义各种名字的时候的统一规范,具体如下:
-
由数字、字母、下划线组成
-
不能数字开头
-
不能使用内置关键字
-
严格区分大小写
命名习惯
-
见名知义。
-
大驼峰:即每个单词首字母都大写,例如:
MyName
。 -
小驼峰:第二个(含)以后的单词首字母大写,例如:
myName
。 -
下划线:例如:
my_name
。
认识数据类型
检测数据类型的方法:
type()
a = 1
print(type(a)) # <class ‘int’> – 整型
b = 1.1
print(type(b)) # <class ‘float’> – 浮点型
c = True
print(type©) # <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’> – 字典
输出
作用:程序输出内容给用户
print(‘hello Python’)
age = 19
print(age)
需求:输出“今年我的年龄是19岁”
格式化符号
| 格式符号 | 转换 |
| — | — |
| ==%s== | 字符串 |
| ==%d== | 有符号的十进制整数 |
| ==%f== | 浮点数 |
| %c | 字符 |
| %u | 无符号十进制整数 |
| %o | 八进制整数 |
| %x | 十六进制整数(小写ox) |
| %X | 十六进制整数(大写OX) |
| %e | 科学计数法(小写’e’) |
| %E | 科学计数法(大写’E’) |
| %g | %f和%e的简写 |
| %G | %f和%E的简写 |
转义字符
-
\n
:换行。 -
\t
:制表符,一个tab键(4个空格)的距离。
结束符
print(‘输出的内容’, end=“\n”)
在Python中,print(), 默认自带
end="\n"
这个换行结束符,所以导致每两个
输入
在Python中,程序接收用户输入的数据的功能即是输入。
input(“提示信息”)
输入的特点
-
当程序执行到
input
,等待用户输入,输入完成之后才继续向下执行。 -
在Python中,
input
接收用户输入后,一般存储到变量,方便使用。 -
在Python中,
input
会把接收到的任意用户输入的数据都当做字符串处理。
转换数据类型
| 函数 | 说明 |
| — | — |
| ==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 ) |
将一个整数转换为一个二进制字符串
|
转换数据类型常用的函数
-
int()
-
float()
-
str()
-
list()
-
tuple()
-
eval()
运算符
算数运算符
| 运算符 | 描述 | 实例 |
| — | — | — |
| + | 加 | 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 |
赋值运算符
| 运算符 | 描述 | 实例 |
| — | — | — |
| = | 赋值 | 将=
右侧的结果赋值给等号左侧的变量 |
复合赋值运算符
| 运算符 | 描述 | 实例 |
| — | — | — |
| += | 加法赋值运算符 | 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 |
比较运算符
| 运算符 | 描述 | 实例 |
| — | — | — |
| == | 判断相等。如果两个操作数的结果相等,则条件结果为真(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 |
逻辑运算符
| 运算符 | 逻辑表达式 | 描述 | 实例 |
| — | — | — | — |
| 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 |
条件语句
假设一个场景:
其实这里所谓的判断就是条件语句,即条件成立执行某些代码,条件不成立则不执行这些代码。
语法
if 条件:
条件成立执行的代码1
条件成立执行的代码2
…
if…else…
作用:条件成立执行if下方的代码; 条件不成立执行else下方的代码。
if 条件:
条件成立执行的代码1
条件成立执行的代码2
…
else:
条件不成立执行的代码1
条件不成立执行的代码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嵌套
if 条件1:
条件1成立执行的代码
条件1成立执行的代码
if 条件2:
条件2成立执行的代码
条件2成立执行的代码
应用:猜拳游戏
需求分析:
-
参与游戏的角色
-
玩家
-
手动出拳
-
电脑
-
随机出拳
-
判断输赢
-
玩家获胜
| 玩家 | 电脑 |
| — | — |
| 石头 | 剪刀 |
| 剪刀 | 布 |
| 布 | 石头 |
-
平局
-
玩家出拳 和 电脑出拳相同
-
电脑获胜
随机做法:
-
导出random模块
-
random.randint(开始,结束)
“”"
提示:0-石头,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(‘电脑获胜’)
三目运算符
三目运算符也叫三元运算符。
语法如下:
值1 if 条件 else 值2
快速体验:
a = 1 b = 2 c = a if a > b else b print(c)
循环
循环的作用:让代码更高效的重复执行。
循环的分类
在Python中,循环分为while
和for
两种,最终实现效果相同。
while的语法
while 条件:
条件成立重复执行的代码1
条件成立重复执行的代码2
…
while的应用
计算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做累加。
计算1-100偶数累加和
分析:1-100的偶数和,即 2 + 4 + 6 + 8…,得到偶数的方法如下:
-
偶数即是和2取余结果为0的数字,可以加入条件语句判断是否为偶数,为偶数则累加
-
初始值为0 / 2 , 计数器每次累加2
方法一:条件判断和2取余数则累加
方法一:条件判断和2取余数为0则累加计算
i = 1
result = 0
while i <= 100:
if i % 2 == 0:
result += i
i += 1
输出2550
print(result)
方法二:计数器控制
方法二:计数器控制增量为2
i = 0
result = 0
while i <= 100:
result += i
i += 2
输出2550
print(result)
while循环嵌套
故事梗概:有天女朋友又生气了,惩罚:说3遍“媳妇儿, 我错了”,这个程序是不是循环即可?但如果女朋友说:还要刷今天晚饭的碗,这个程序怎么书写?
while 条件:
print(‘媳妇儿, 我错了’)
print(‘刷晚饭的碗’)
但如果女朋友还是生气,把这套惩罚要连续3天都执行,有如何书写程序?
while 条件:
while 条件:
print(‘媳妇儿, 我错了’)
print(‘刷晚饭的碗’)
while 条件1:
条件1成立执行的代码
…
while 条件2:
条件2成立执行的代码
…
总结:所谓while循环嵌套,就是一个while里面嵌套一个while的写法,每个while和之前的基础语法是相同的。
for循环
语法
for 临时变量 in 序列:
重复执行的代码1
重复执行的代码2
…
else
循环可以和else配合使用,else下方缩进的代码指的是当循环正常结束之后要执行的代码。
while…else
需求:女朋友生气了,要惩罚:连续说5遍“媳妇儿,我错了”,如果道歉正常完毕女朋友就原谅我了,这个程序怎么写?
i = 1
while i <= 5:
print(‘媳妇儿,我错了’)
i += 1
print(‘媳妇儿原谅我了…’)
思考: 这个print是不是没有循环也能执行?
语法
while 条件:
条件成立重复执行的代码
else:
循环正常结束之后要执行的代码
示例
i = 1 while i <= 5: print('媳妇儿,我错了') i += 1 else: print('媳妇原谅我了,真开心,哈哈哈哈')
for…else
语法
for 临时变量 in 序列:
重复执行的代码
…
else:
循环正常结束之后要执行的代码
所谓else指的是循环正常结束之后要执行的代码,即如果是break终止循环的情况,else下方缩进的代码将不执行。
示例
str1 = ‘itheima’
for i in str1:
print(i)
else:
print(‘循环正常结束之后执行的代码’)
总结
-
循环的作用:控制代码重复执行
-
while语法
while 条件:
条件成立重复执行的代码1
条件成立重复执行的代码2
…
- while循环嵌套语法
while 条件1:
条件1成立执行的代码
…
while 条件2:
条件2成立执行的代码
…
- for循环语法
for 临时变量 in 序列:
重复执行的代码1
重复执行的代码2
…
-
break退出整个循环
-
continue退出本次循环,继续执行下一次重复执行的代码
-
else
-
while和for都可以配合else使用
-
else下方缩进的代码含义:当循环正常结束后执行的代码
-
break终止循环不会执行else下方缩进的代码
-
continue退出循环的方式执行else下方缩进的代码
字符串
字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。
a = ‘hello world’
b = “abcdefg”
print(type(a))
print(type(b))
注意:控制台显示结果为
<class 'str'>
, 即数据类型为str(字符串)。
字符串输出
print(‘hello world’)
name = ‘Tom’
print(‘我的名字是%s’ % name)
print(f’我的名字是{name}')
字符串输入
在Python中,使用input()
接收用户输入。
- 代码
name = input(‘请输入您的名字:’)
print(f’您输入的名字是{name}')
print(type(name))
password = input(‘请输入您的密码:’)
print(f’您输入的密码是{password}')
print(type(password))
切片
切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。
语法
序列[开始位置下标:结束位置下标:步长]
注意
-
不包含结束位置下标对应的数据, 正负整数均可;
-
步长是选取间隔,正负整数均可,默认步长为1。
体验
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
修改
所谓修改字符串,指的就是通过函数的形式修改字符串中的数据。
- replace():替换
- 语法
字符串序列.replace(旧子串, 新子串, 替换次数)
注意:替换次数如果查出子串出现次数,则替换次数为该子串出现次数。
- 快速体验
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():按照指定字符分割字符串。
- 语法
字符串序列.split(分割字符, num)
注意:num表示的是分割字符出现的次数,即将来返回数据个数为num+1个。
- 快速体验
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():用一个字符或子串合并字符串,即是将多个字符串合并为一个新的字符串。
- 语法
字符或子串.join(多字符串组成的序列)
- 快速体验
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())
判断
所谓判断即是判断真假,返回的结果是布尔型数据类型:True 或 False。
- startswith():检查字符串是否是以指定子串开头,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
- 语法
字符串序列.startswith(子串, 开始位置下标, 结束位置下标)
- 快速体验
mystr = "hello world and itcast and itheima and Python "
结果:True
print(mystr.startswith(‘hello’))
结果False
print(mystr.startswith(‘hello’, 5, 20))
- endswith()::检查字符串是否是以指定子串结尾,是则返回 True,否则返回 False。如果设置开始和结束位置下标,则在指定范围内检查。
- 语法
字符串序列.endswith(子串, 开始位置下标, 结束位置下标)
- 快速体验
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())
结果:False
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())
总结
-
下标
-
计算机为数据序列中每个元素分配的从0开始的编号
-
切片
序列名[开始位置下标:结束位置下标:步长]
-
常用操作方法
-
find()
-
index()
列表
–
思考:有一个人的姓名(TOM)怎么书写存储程序?
答:变量。
思考:如果一个班级100位学生,每个人的姓名都要存储,应该如何书写程序?声明100个变量吗?
答:列表即可, 列表一次性可以存储多个数据。
列表的格式
[数据1, 数据2, 数据3, 数据4…]
列表可以一次性存储多个数据,且可以为不同数据类型。
列表的常用操作
列表的作用是一次性存储多个数据,程序员可以对这些数据进行的操作有:增、删、改、查。
查找
下标
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
print(name_list[0]) # Tom
print(name_list[1]) # Lily
print(name_list[2]) # Rose
函数
- index():返回指定数据所在位置的下标 。
- 语法
列表序列.index(数据, 开始位置下标, 结束位置下标)
- 快速体验
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
print(name_list.index(‘Lily’, 0, 2)) # 1
注意:如果查找的数据不存在则报错。
- count():统计指定数据在当前列表中出现的次数。
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
print(name_list.count(‘Lily’)) # 1
- len():访问列表长度,即列表中数据的个数。
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
print(len(name_list)) # 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}, 名字不存在’)
增加
–
作用:增加指定数据到列表中。
- append():列表结尾追加数据。
- 语法
列表序列.append(数据)
- 体验
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
name_list.append(‘xiaoming’)
结果:[‘Tom’, ‘Lily’, ‘Rose’, ‘xiaoming’]
print(name_list)
列表追加数据的时候,直接在原列表里面追加了指定数据,即修改了原列表,故列表为可变类型数据。
- 注意点
如果append()追加的数据是一个序列,则追加整个序列到列表
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
name_list.append([‘xiaoming’, ‘xiaohong’])
结果:[‘Tom’, ‘Lily’, ‘Rose’, [‘xiaoming’, ‘xiaohong’]]
print(name_list)
- extend():列表结尾追加数据,如果数据是一个序列,则将这个序列的数据逐一添加到列表。
- 语法
列表序列.extend(数据)
- 快速体验
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():指定位置新增数据。
- 语法
列表序列.insert(位置下标, 数据)
- 快速体验
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
name_list.insert(1, ‘xiaoming’)
结果:[‘Tom’, ‘xiaoming’, ‘Lily’, ‘Rose’]
print(name_list)
删除
-
del
-
语法
del 目标
快速体验
删除列表
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
结果:报错提示:name ‘name_list’ is not defined
del name_list
print(name_list)
删除指定数据
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
del name_list[0]
结果:[‘Lily’, ‘Rose’]
print(name_list)
-
pop():删除指定下标的数据(默认为最后一个),并返回该数据。
-
语法
列表序列.pop(下标)
- 快速体验
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
del_name = name_list.pop(1)
结果:Lily
print(del_name)
结果:[‘Tom’, ‘Rose’]
print(name_list)
- remove():移除列表中某个数据的第一个匹配项。
- 语法
列表序列.remove(数据)
- 快速体验
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) # 结果: []
修改
- 修改指定下标数据
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()
- 语法
列表序列.sort( key=None, reverse=False)
注意:reverse表示排序规则,reverse = True 降序, reverse = False 升序(默认)
- 快速体验
num_list = [1, 5, 2, 3, 6, 8]
num_list.sort()
结果:[1, 2, 3, 5, 6, 8]
print(num_list)
复制
–
函数:copy()
name_list = [‘Tom’, ‘Lily’, ‘Rose’]
name_li2 = name_list.copy()
结果:[‘Tom’, ‘Lily’, ‘Rose’]
print(name_li2)
列表嵌套
所谓列表嵌套指的就是一个列表里面包含了其他的子列表。
应用场景:要存储班级一、二、三三个班级学生姓名,且每个班级的学生姓名在一个列表。
name_list = [[‘小明’, ‘小红’, ‘小绿’], [‘Tom’, ‘Lily’, ‘Rose’], [‘张三’, ‘李四’, ‘王五’]]
思考: 如何查找到数据"李四"?
第一步:按下标查找到李四所在的列表
print(name_list[2])
第二步:从李四所在的列表里面,再按下标找到数据李四
print(name_list[2][1])
总结
- 列表的格式
[数据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)
总结
- 定义元组
t1 = (10, 20, 30)
t2 = (10,)
-
常用操作方法
-
index()
-
len()
字典
–
思考1: 如果有多个数据,例如:‘Tom’, ‘男’, 20,如何快速存储?
答:列表
list1 = [‘Tom’, ‘男’, 20]
思考2:如何查找到数据’Tom’?
答:查找到下标为0的数据即可。
list1[0]
思考3:如果将来数据顺序发生变化,如下所示,还能用list1[0]
访问到数据’Tom’吗?。
list1 = [‘男’, 20, ‘Tom’]
答:不能,数据’Tom’此时下标为2。
思考4:数据顺序发生变化,每个数据的下标也会随之变化,如何保证数据顺序变化前后能使用同一的标准查找数据呢?
答:字典,字典里面的数据是以键值对形式出现,字典数据和数据顺序没有关系,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找数据即可。
创建字典的语法
字典特点:
-
符号为大括号
-
数据为键值对形式出现
-
各个键值对之间用逗号隔开
有数据字典
dict1 = {‘name’: ‘Tom’, ‘age’: 20, ‘gender’: ‘男’}
空字典
dict2 = {}
dict3 = dict()
注意:一般称冒号前面的为键(key),简称k;冒号后面的为值(value),简称v。
字典常见操作
增
写法:字典序列[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)
注意:字典为可变类型。
删
- 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) # {}
改
写法:字典序列[key] = 值
注意:如果key存在则修改这个key对应的值 ;如果key不存在则新增此键值对。
查
值查找
dict1 = {‘name’: ‘Tom’, ‘age’: 20, ‘gender’: ‘男’}
print(dict1[‘name’]) # Tom
print(dict1[‘id’]) # 报错
如果当前查找的key存在,则返回对应的值;否则则报错。
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
keys()
dict1 = {‘name’: ‘Tom’, ‘age’: 20, ‘gender’: ‘男’}
print(dict1.keys()) # dict_keys([‘name’, ‘age’, ‘gender’])
values()
dict1 = {‘name’: ‘Tom’, ‘age’: 20, ‘gender’: ‘男’}
print(dict1.values()) # dict_values([‘Tom’, 20, ‘男’])
items()
dict1 = {‘name’: ‘Tom’, ‘age’: 20, ‘gender’: ‘男’}
print(dict1.items()) # dict_items([(‘name’, ‘Tom’), (‘age’, 20), (‘gender’, ‘男’)])
总结
- 定义字典
dict1 = {‘name’: ‘Python’, ‘age’: 30}
dict2 = {}
dict3 = dict()
-
常见操作
-
增/改
字典序列[key] = 值
-
查找
-
字典序列[key]
-
keys()
-
values()
-
items()
集合
–
创建集合
创建集合使用{}
或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
特点:
- 集合可以去掉重复数据;
- 集合数据是无序的,故不支持下标
集合常见操作方法
增加数据
- 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)
删除数据
- 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)
查找数据
-
in:判断数据在集合序列
-
not in:判断数据不在集合序列
s1 = {10, 20, 30, 40, 50}
print(10 in s1)
print(10 not in s1)
总结
-
创建集合
-
有数据集合
s1 = {数据1, 数据2, …}
- 无数据集合
s1 = set()
-
常见操作
-
增加数据
-
add()
-
update()
-
删除数据
-
remove()
-
discard()
公共操作
运算符
| 运算符 | 描述 | 支持的容器类型 |
| — | — | — |
| + | 合并 | 字符串、列表、元组 |
| * | 复制 | 字符串、列表、元组 |
| in | 元素是否存在 | 字符串、列表、元组、字典 |
| not in | 元素是否不存在 | 字符串、列表、元组、字典 |
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. 字符串
print(‘-’ * 10) # ----------
2. 列表
list1 = [‘hello’]
print(list1 * 4) # [‘hello’, ‘hello’, ‘hello’, ‘hello’]
3. 元组
t1 = (‘world’,)
print(t1 * 4) # (‘world’, ‘world’, ‘world’, ‘world’)
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 循环当中。 |
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
del()
1. 字符串
str1 = ‘abcdefg’
del str1
print(str1)
2. 列表
list1 = [10, 20, 30, 40]
del(list1[0])
print(list1) # [20, 30, 40]
max()
1. 字符串
str1 = ‘abcdefg’
print(max(str1)) # g
2. 列表
list1 = [10, 20, 30, 40]
print(max(list1)) # 40
min()
1. 字符串
str1 = ‘abcdefg’
print(min(str1)) # a
2. 列表
list1 = [10, 20, 30, 40]
print(min(list1)) # 10
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数字。
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}')
容器类型转换
tuple()
作用:将某个序列转换成元组
list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}
print(tuple(list1))
print(tuple(s1))
list()
作用:将某个序列转换成列表
t1 = (‘a’, ‘b’, ‘c’, ‘d’, ‘e’)
s1 = {100, 200, 300, 400, 500}
print(list(t1))
print(list(s1))
set()
作用:将某个序列转换成集合
list1 = [10, 20, 30, 40, 50, 20]
t1 = (‘a’, ‘b’, ‘c’, ‘d’, ‘e’)
print(set(list1))
print(set(t1))
注意:
-
集合可以快速完成列表去重
-
集合不支持下标
总结
-
运算符
-
-
in / not in
-
公共方法
-
len()
-
del()
-
range()
-
enumerate()
-
数据类型转换
-
tuple()
-
list()
-
set()
推导式
作用:用一个表达式创建一个有规律的列表或控制一个有规律列表。
列表推导式又叫列表生成式。
快速体验
需求:创建一个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)
带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)
多个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’]
如何快速合并为一个字典?
答:字典推导式
字典推导式作用:快速合并列表为字典或提取字典中目标数据。
快速体验
- 创建一个字典:字典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}
- 将两个列表合并为一个字典
list1 = [‘name’, ‘age’, ‘gender’]
list2 = [‘Tom’, 20, ‘man’]
dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)
- 提取字典中目标数据
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}
注意:集合有数据去重功能。
总结
-
推导式的作用:简化代码
-
推导式写法
列表推导式
[xx for xx in range()]
字典推导式
{xx1: xx2 for … in …}
集合推导式
{xx for xx in …}
函数一
函数的作用
需求:用户到ATM机取钱:
-
输入密码后显示"选择功能"界面
-
查询余额后显示"选择功能"界面
-
取2000钱后显示"选择功能"界面
特点:显示“选择功能”界面需要重复输出给用户,怎么实现?
函数就是将一段具有独立功能的代码块 整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。
函数在开发过程中,可以更高效的实现代码重用。
函数的使用步骤
定义函数
def 函数名(参数):
代码1
代码2
…
调用函数
函数名(参数)
注意:
-
不同的需求,参数可有可无。
-
在Python中,函数必须先定义后使用。
快速体验
需求:复现ATM取钱功能。
- 搭建整体框架(复现需求)
print(‘密码正确登录成功’)
显示"选择功能"界面
print(‘查询余额完毕’)
显示"选择功能"界面
print(‘取了2000元钱’)
显示"选择功能"界面
- 确定“选择功能”界面内容
print(‘查询余额’)
print(‘存款’)
print(‘取款’)
- 封装"选择功能"
注意:一定是先定义函数,后调用函数。
封装ATM机功能选项 – 定义函数
def select_func():
print(‘-----请选择功能-----’)
print(‘查询余额’)
print(‘存款’)
print(‘取款’)
print(‘-----请选择功能-----’)
- 调用函数
在需要显示“选择功能”函数的位置调用函数。
print(‘密码正确登录成功’)
显示"选择功能"界面 – 调用函数
select_func()
print(‘查询余额完毕’)
显示"选择功能"界面 – 调用函数
select_func()
print(‘取了2000元钱’)
显示"选择功能"界面 – 调用函数
select_func()
函数的参数作用
思考:完成需求如下:一个函数完成两个数1和2的加法运算,如何书写程序?
定义函数
def add_num1():
result = 1 + 2
print(result)
调用函数
add_num1()
思考:上述add_num1函数只能完成数字1和2的加法运算,如果想要这个函数变得更灵活,可以计算任何用户指定的两个数字的和,如何书写程序?
分析:用户要在调用函数的时候指定具体数字,那么在定义函数的时候就需要接收用户指定的数字。函数调用时候指定的数字和定义函数时候接收的数字即是函数的参数。
定义函数时同时定义了接收用户数据的参数a和b,a和b是形参
def add_num2(a, b):
result = a + b
print(result)
调用函数时传入了真实的数据10 和 20,真实数据为实参
add_num2(10, 20)
函数的返回值作用
例如:我们去超市购物,比如买烟,给钱之后,是不是售货员会返回给我们烟这个商品,在函数中,如果需要返回结果给用户需要使用函数返回值。
def buy():
return ‘烟’
使用变量保存函数返回值
goods = buy()
print(goods)
应用
–
需求:制作一个计算器,计算任意两数字之和,并保存结果。
def sum_num(a, b):
return a + b
用result变量保存函数返回值
result = sum_num(1, 2)
print(result)
函数的说明文档
思考:定义一个函数后,程序员如何书写程序能够快速提示这个函数的作用?
答:注释
思考:如果代码多,我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释?如果想更方便的查看函数的作用怎么办?
答:函数的说明文档
函数的说明文档也叫函数的文档说明。
语法
–
- 定义函数的说明文档
def 函数名(参数):
“”" 说明文档的位置 “”"
代码
…
- 查看函数的说明文档
help(函数名)
快速体验
def sum_num(a, b):
“”" 求和函数 “”"
return a + b
help(sum_num)
函数嵌套调用
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。
- 示例
def testB():
print(‘---- testB start----’)
print(‘这里是testB函数执行的代码…(省略)…’)
print(‘---- testB end----’)
def testA():
print(‘---- testA start----’)
testB()
print(‘---- testA end----’)
testA()
- 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置。
函数应用
函数计算
- 求三个数之和
def sum_num(a, b, c):
return a + b + c
result = sum_num(1, 2, 3)
print(result) # 6
- 求三个数平均值
def average_num(a, b, c):
sumResult = sum_num(a, b, c)
return sumResult / 3
result = average_num(1, 2, 3)
print(result) # 2.0
总结
-
函数的作用:封装代码,高效的代码重用
-
函数使用步骤
-
定义函数
def 函数名():
代码1
代码2
…
- 调用函数
函数名()
-
函数的参数:函数调用的时候可以传入真实数据,增大函数的使用的灵活性
-
形参:函数定义时书写的参数(非真实数据)
-
实参:函数调用时书写的参数(真实数据)
-
函数的返回值
-
作用:函数调用后,返回需要的计算结果
-
写法
return 表达式
-
函数的说明文档
-
作用:保存函数解释说明的信息
-
写法
def 函数名():
“”" 函数说明文档 “”"
- 函数嵌套调用:一个函数内部嵌套调用另外一个函数
函数二
变量作用域
变量作用域指的是变量生效的范围,主要分为两类:局部变量和全局变量。
- 局部变量
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def testA():
a = 100
print(a)
testA() # 100
print(a) # 报错:name ‘a’ is not defined
变量a是定义在
testA
函数内部的变量,在函数外部访问则立即报错。
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
- 全局变量
所谓全局变量,指的是在函数体内、外都能生效的变量。
思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办?
答:将这个数据存储在一个全局变量里面。
定义全局变量a
a = 100
def testA():
print(a) # 访问全局变量a,并打印变量a存储的数据
def testB():
print(a) # 访问全局变量a,并打印变量a存储的数据
testA() # 100
testB() # 100
思考:testB
函数需求修改变量a的值为200,如何修改程序?
a = 100
def testA():
print(a)
def testB():
a = 200
print(a)
testA() # 100
testB() # 200
print(f’全局变量a = {a}') # 全局变量a = 100
思考:在testB
函数内部的a = 200
中的变量a是在修改全局变量a
吗?
答:不是。观察上述代码发现,15行得到a的数据是100,仍然是定义全局变量a时候的值,而没有返回
testB
函数内部的200。综上:testB
函数内部的a = 200
是定义了一个局部变量。
思考:如何在函数体内部修改全局变量?
a = 100
def testA():
print(a)
def testB():
global 关键字声明a是全局变量
global a
a = 200
print(a)
testA() # 100
testB() # 200
print(f’全局变量a = {a}') # 全局变量a = 200
多函数程序执行流程
一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,如下所示:
- 共用全局变量
1. 定义全局变量
glo_num = 0
def test1():
global glo_num
修改全局变量
glo_num = 100
def test2():
调用test1函数中修改后的全局变量
print(glo_num)
2. 调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
3. 调用test2函数,执行函数内部代码:打印
test2() # 100
- 返回值作为参数传递
def test1():
return 50
def test2(num):
print(num)
1. 保存函数test1的返回值
result = test1()
2.将函数返回值所在变量作为参数传递到test2函数
test2(result) # 50
函数的返回值
思考:如果一个函数如些两个return (如下所示),程序如何执行?
def return_num():
return 1
return 2
result = return_num()
print(result) # 1
答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执行。
思考:如果一个函数要有多个返回值,该如何书写代码?
def return_num():
return 1, 2
result = return_num()
print(result) # (1, 2)
注意:
return a, b
写法,返回多个数据的时候,默认是元组类型。
- return后面可以连接列表、元组或字典,以返回多个值。
函数的参数
位置参数
位置参数:调用函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):
print(f’您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info(‘TOM’, 20, ‘男’)
注意:传递和定义参数的顺序及个数必须一致。
关键字参数
函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
def user_info(name, age, gender):
print(f’您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info(‘Rose’, age=20, gender=‘女’)
user_info(‘小明’, gender=‘男’, age=16)
注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
def user_info(name, age, gender=‘男’):
print(f’您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info(‘TOM’, 20)
user_info(‘Rose’, 18, ‘女’)
注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。
不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
- 包裹位置传递
def user_info(*args):
print(args)
(‘TOM’,)
user_info(‘TOM’)
(‘TOM’, 18)
user_info(‘TOM’, 18)
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
- 包裹关键字传递
def user_info(**kwargs):
print(kwargs)
{‘name’: ‘TOM’, ‘age’: 18, ‘id’: 110}
user_info(name=‘TOM’, age=18, id=110)
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
拆包和交换变量值
拆包
–
- 拆包:元组
def return_num():
return 100, 200
num1, num2 = return_num()
print(num1) # 100
print(num2) # 200
- 拆包:字典
dict1 = {‘name’: ‘TOM’, ‘age’: 18}
a, b = dict1
对字典进行拆包,取出来的是字典的key
print(a) # name
print(b) # age
print(dict1[a]) # TOM
print(dict1[b]) # 18
交换变量值
需求:有变量a = 10
和b = 20
,交换两个变量的值。
- 方法一
借助第三变量存储数据。
1. 定义中间变量
c = 0
2. 将a的数据存储到c
c = a
3. 将b的数据20赋值到a,此时a = 20
a = b
4. 将之前c的数据10赋值到b,此时b = 10
b = c
print(a) # 20
print(b) # 10
- 方法二
a, b = 1, 2
a, b = b, a
print(a) # 2
print(b) # 1
引用
了解引用
在python中,值是靠引用来传递来的。
我们可以用id()
来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标识。
1. int类型
a = 1
b = a
print(b) # 1
print(id(a)) # 140708464157520
print(id(b)) # 140708464157520
a = 2
print(b) # 1,说明int类型为不可变类型
print(id(a)) # 140708464157552,此时得到是的数据2的内存地址
print(id(b)) # 140708464157520
2. 列表
aa = [10, 20]
bb = aa
print(id(aa)) # 2325297783432
print(id(bb)) # 2325297783432
aa.append(30)
print(bb) # [10, 20, 30], 列表为可变类型
print(id(aa)) # 2325297783432
print(id(bb)) # 2325297783432
引用当做实参
代码如下:
def test1(a):
print(a)
print(id(a))
a += a
print(a)
print(id(a))
int:计算前后id值不同
b = 100
test1(b)
列表:计算前后id值相同
c = [11, 22]
test1©
可变和不可变类型
所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变.
-
可变类型
-
列表
-
字典
-
集合
-
不可变类型
-
整型
-
浮点型
-
字符串
-
元组
总结
-
变量作用域
-
全局:函数体内外都能生效
-
局部:当前函数体内部生效
-
函数多返回值写法
return 表达式1, 表达式2…
-
函数的参数
-
位置参数
-
形参和实参的个数和书写顺序必须一致
-
关键字参数
-
写法:
key=value
-
特点:形参和实参的书写顺序可以不一致;关键字参数必须书写在位置参数的后面
-
缺省参数
-
缺省参数就是默认参数
-
写法:
key=vlaue
-
不定长位置参数
-
收集所有位置参数,返回一个元组
-
不定长关键字参数
-
收集所有关键字参数,返回一个字典
-
引用:Python中,数据的传递都是通过引用
函数三
应用:学员管理系统
系统简介
需求:进入系统显示系统功能界面,功能如下:
-
1、添加学员
-
2、删除学员
-
3、修改学员信息
-
4、查询学员信息
-
5、显示所有学员信息
-
6、退出系统
系统共6个功能,用户根据自己需求选取。
步骤分析
-
显示功能界面
-
用户输入功能序号
-
根据用户输入的功能序号,执行不同的功能(函数)
3.1 定义函数
3.2 调用函数
需求实现
显示功能界面
定义函数print_info
,负责显示系统功能。
def print_info():
print(‘-’ * 20)
print(‘欢迎登录学员管理系统’)
print(‘1: 添加学员’)
print(‘2: 删除学员’)
print(‘3: 修改学员信息’)
print(‘4: 查询学员信息’)
print(‘5: 显示所有学员信息’)
print(‘6: 退出系统’)
print(‘-’ * 20)
print_info()
用户输入序号,选择功能
user_num = input(‘请选择您需要的功能序号:’)
根据用户选择,执行不同的功能
if user_num == ‘1’:
print(‘添加学员’)
elif user_num == ‘2’:
print(‘删除学员’)
elif user_num == ‘3’:
print(‘修改学员信息’)
elif user_num == ‘4’:
print(‘查询学员信息’)
elif user_num == ‘5’:
print(‘显示所有学员信息’)
elif user_num == ‘6’:
print(‘退出系统’)
工作中,需要根据实际需求调优代码。
- 用户选择系统功能的代码需要循环使用,直到用户主动退出系统。
- 如果用户输入1-6以外的数字,需要提示用户。
while True:
1. 显示功能界面
print_info()
2. 用户选择功能
user_num = input(‘请选择您需要的功能序号:’)
3. 根据用户选择,执行不同的功能
if user_num == ‘1’:
print(‘添加学员’)
elif user_num == ‘2’:
print(‘删除学员’)
elif user_num == ‘3’:
print(‘修改学员信息’)
elif user_num == ‘4’:
print(‘查询学员信息’)
elif user_num == ‘5’:
print(‘显示所有学员信息’)
elif user_num == ‘6’:
print(‘退出系统’)
else:
print(‘输入错误,请重新输入!!!’)
定义不同功能的函数
所有功能函数都是操作学员信息,所有存储所有学员信息应该是一个全局变量,数据类型为列表。
info = []
1.3.4.1 添加学员
- 需求分析
-
接收用户输入学员信息,并保存
-
判断是否添加学员信息
2.1 如果学员姓名已经存在,则报错提示
2.2 如果学员姓名不存在,则准备空字典,将用户输入的数据追加到字典,再列表追加字典数据
- 对应的if条件成立的位置调用该函数
- 代码实现
def add_info():
“”" 添加学员 “”"
接收用户输入学员信息
new_id = input(‘请输入学号:’)
new_name = input(‘请输入姓名:’)
new_tel = input(‘请输入手机号:’)
声明info是全局变量
global info
检测用户输入的姓名是否存在,存在则报错提示
for i in info:
if new_name == i[‘name’]:
print(‘该用户已经存在!’)
return
如果用户输入的姓名不存在,则添加该学员信息
info_dict = {}
将用户输入的数据追加到字典
info_dict[‘id’] = new_id
info_dict[‘name’] = new_name
info_dict[‘tel’] = new_tel
将这个学员的字典数据追加到列表
info.append(info_dict)
print(info)
删除学员
- 需求分析
按用户输入的学员姓名进行删除
-
用户输入目标学员姓名
-
检查这个学员是否存在
2.1 如果存在,则列表删除这个数据
2.2 如果不存在,则提示“该用户不存在”
- 对应的if条件成立的位置调用该函数
- 代码实现
删除学员
def del_info():
“”“删除学员”“”
1. 用户输入要删除的学员的姓名
del_name = input(‘请输入要删除的学员的姓名:’)
global info
2. 判断学员是否存在:如果输入的姓名存在则删除,否则报错提示
for i in info:
if del_name == i[‘name’]:
info.remove(i)
break
else:
print(‘该学员不存在’)
print(info)
修改学员信息
- 需求分析
-
用户输入目标学员姓名
-
检查这个学员是否存在
2.1 如果存在,则修改这位学员的信息,例如手机号
2.2 如果不存在,则报错
- 对应的if条件成立的位置调用该函数
- 代码实现
修改函数
def modify_info():
“”“修改函数”“”
1. 用户输入要修改的学员的姓名
modify_name = input(‘请输入要修改的学员的姓名:’)
global info
2. 判断学员是否存在:如果输入的姓名存在则修改手机号,否则报错提示
for i in info:
if modify_name == i [‘name’]:
i[‘tel’] = input(‘请输入新的手机号:’)
break
else:
print(‘该学员不存在’)
print(info)
查询学员信息
- 需求分析
-
用户输入目标学员姓名
-
检查学员是否存在
2.1 如果存在,则显示这个学员的信息
2.2 如果不存在,则报错提示
- 对应的if条件成立的位置调用该函数
- 代码实现
查询学员
def search_info():
“”“查询学员”“”
1. 输入要查找的学员姓名:
search_name = input(‘请输入要查找的学员姓名:’)
global info
2. 判断学员是否存在:如果输入的姓名存在则显示这位学员信息,否则报错提示
for i in info:
if search_name == i[‘name’]:
print(‘查找到的学员信息如下:----------’)
print(f"该学员的学号是{i[‘id’]}, 姓名是{i[‘name’]}, 手机号是{i[‘tel’]}")
break
else:
print(‘该学员不存在’)
显示所有学员信息
- 需求分析
打印所有学员信息
- 代码实现
显示所有学员信息
def print_all():
“”" 显示所有学员信息 “”"
print(‘学号\t姓名\t手机号’)
for i in info:
print(f’{i[“id”]}\t{i[“name”]}\t{i[“tel”]}')
1.3.4.6 退出系统
在用户输入功能序号6
的时候要退出系统,代码如下:
…
elif user_num == ‘6’:
exit_flag = input(‘确定要退出吗?yes or no’)
if exit_flag == ‘yes’:
break
递归
递归是一种编程思想,应用场景:
-
在我们日常开发中,如果要遍历一个文件夹下面所有的文件,通常会使用递归来实现;
-
在后续的算法课程中,很多算法都离不开递归,例如:快速排序。
递归的特点
-
函数内部自己调用自己
-
必须有出口
应用:3以内数字累加和
- 代码
3 + 2 + 1
def sum_numbers(num):
1.如果是1,直接返回1 – 出口
if num == 1:
return 1
2.如果不是1,重复执行累加并返回结果
return num + sum_numbers(num-1)
sum_result = sum_numbers(3)
输出结果为6
print(sum_result)
lambda 表达式
如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda简化。
lambda语法
lambda 参数列表 : 表达式
注意
-
lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
-
lambda表达式能接收任何数量的参数但只能返回一个表达式的值。
快速入门
函数
def fn1():
return 200
print(fn1)
print(fn1())
lambda表达式
fn2 = lambda: 100
print(fn2)
print(fn2())
注意:直接打印lambda表达式,输出的是此lambda的内存地址
示例:计算a + b
函数实现
def add(a, b):
return a + b
result = add(1, 2)
print(result)
思考:需求简单,是否代码多?
lambda实现
fn1 = lambda a, b: a + b
print(fn1(1, 2))
lambda的参数形式
无参数
fn1 = lambda: 100
print(fn1())
一个参数
fn1 = lambda a: a
print(fn1(‘hello world’))
默认参数
fn1 = lambda a, b, c=100: a + b + c
print(fn1(10, 20))
可变参数:*args
fn1 = lambda *args: args
print(fn1(10, 20, 30))
注意:这里的可变参数传入到lambda之后,返回值为元组。
可变参数:**kwargs
fn1 = lambda **kwargs: kwargs
print(fn1(name=‘python’, age=20))
lambda的应用
带判断的lambda
fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500))
列表数据按字典key的值排序
students = [
{‘name’: ‘TOM’, ‘age’: 20},
{‘name’: ‘ROSE’, ‘age’: 19},
{‘name’: ‘Jack’, ‘age’: 22}
]
按name值升序排列
students.sort(key=lambda x: x[‘name’])
print(students)
按name值降序排列
students.sort(key=lambda x: x[‘name’], reverse=True)
print(students)
按age值升序排列
students.sort(key=lambda x: x[‘age’])
print(students)
高阶函数
==把函数作为参数传入==,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
体验高阶函数
在Python中,abs()
函数可以完成对数字求绝对值计算。
abs(-10) # 10
round()
函数可以完成对数字的四舍五入计算。
round(1.2) # 1
round(1.9) # 2
需求:任意两个数字,按照指定要求整理数字后再进行求和计算。
- 方法1
def add_num(a, b):
return abs(a) + abs(b)
result = add_num(-1, 2)
print(result) # 3
- 方法2
def sum_num(a, b, f):
return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result) # 3
注意:两种方法对比之后,发现,方法2的代码会更加简洁,函数灵活性更高。
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
内置高阶函数
map()
map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
需求:计算list1
序列中各个数字的2次方。
list1 = [1, 2, 3, 4, 5]
def func(x):
return x ** 2
result = map(func, list1)
print(result) # <map object at 0x0000013769653198>
print(list(result)) # [1, 4, 9, 16, 25]
reduce()
reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。
注意:reduce()传入的参数func必须接收2个参数。
需求:计算list1
序列中各个数字的累加和。
import functools
list1 = [1, 2, 3, 4, 5]
def func(a, b):
return a + b
result = functools.reduce(func, list1)
print(result) # 15
filter()
filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
return x % 2 == 0
result = filter(func, list1)
print(result) # <filter object at 0x0000017AF9DC3198>
print(list(result)) # [2, 4, 6, 8, 10]
总结
-
递归
-
函数内部自己调用自己
-
必须有出口
-
lambda
-
语法
lambda 参数列表: 表达式
-
lambda的参数形式
-
无参数
lambda: 表达式
- 一个参数
lambda 参数: 表达式
- 默认参数
lambda key=value: 表达式
- 不定长位置参数
lambda *args: 表达式
- 不定长关键字参数
lambda **kwargs: 表达式
-
高阶函数
-
作用:把函数作为参数传入,化简代码
-
内置高阶函数
-
map()
-
reduce()
-
filter()
文件操作
文件操作的作用
思考:什么是文件?
思考:文件操作包含什么?
答:打开、关闭、读、写、复制…
思考:文件操作的的作用是什么?
答:读取内容、写入内容、备份内容…
总结:文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
文件的基本操作
文件操作步骤
-
打开文件
-
读写等操作
-
关闭文件
注意:可以只打开和关闭文件,不进行任何读写操作。
打开
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:
open(name, mode)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
打开文件模式
| 模式 | 描述 |
| — | — |
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
| rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
| r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
| rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
| w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
| ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
快速体验
f = open(‘test.txt’, ‘w’)
注意:此时的
f
是open
函数的文件对象。
文件对象方法
写
- 语法
对象对象.write(‘内容’)
- 体验
1. 打开文件
f = open(‘test.txt’, ‘w’)
2.文件写入
f.write(‘hello world’)
3. 关闭文件
f.close()
注意:
w
和a
模式:如果文件不存在则创建该文件;如果文件存在,w
模式先清空再写入,a
模式直接末尾追加。
r
模式:如果文件不存在则报错。
读
- read()
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
- readlines()
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open(‘test.txt’)
content = f.readlines()
[‘hello world\n’, ‘abcdefg\n’, ‘aaa\n’, ‘bbb\n’, ‘ccc’]
print(content)
关闭文件
f.close()
- readline()
readline()一次读取一行内容。
f = open(‘test.txt’)
content = f.readline()
print(f’第一行:{content}')
content = f.readline()
print(f’第二行:{content}')
关闭文件
f.close()
seek()
作用:用来移动文件指针。
语法如下:
文件对象.seek(偏移量, 起始位置)
起始位置:
- 0:文件开头
- 1:当前位置
- 2:文件结尾
关闭
文件对象.close()
文件备份
需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。
步骤
–
-
接收用户输入的文件名
-
规划备份文件名
-
备份文件写入数据
代码实现
- 接收用户输入目标文件名
old_name = input(‘请输入您要备份的文件名:’)
- 规划备份文件名
2.1 提取目标文件后缀
2.2 组织备份的文件名,xx[备份]后缀
2.1 提取文件后缀点的下标
index = old_name.rfind(‘.’)
print(index) # 后缀中.的下标
print(old_name[:index]) # 源文件名(无后缀)
2.2 组织新文件名 旧文件名 + [备份] + 后缀
new_name = old_name[:index] + ‘[备份]’ + old_name[index:]
打印新文件名(带后缀)
print(new_name)
- 备份文件写入数据
3.1 打开源文件 和 备份文件
3.2 将源文件数据写入备份文件
3.3 关闭文件
3.1 打开文件
old_f = open(old_name, ‘rb’)
new_f = open(new_name, ‘wb’)
3.2 将源文件数据写入备份文件
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
3.3 关闭文件
old_f.close()
new_f.close()
思考
–
如果用户输入.txt
,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?
答:添加条件判断即可。
old_name = input(‘请输入您要备份的文件名:’)
index = old_name.rfind(‘.’)
if index > 0:
postfix = old_name[index:]
new_name = old_name[:index] + ‘[备份]’ + postfix
old_f = open(old_name, ‘rb’)
new_f = open(new_name, ‘wb’)
while True:
con = old_f.read(1024)
if len(con) == 0:
break
new_f.write(con)
old_f.close()
new_f.close()
文件和文件夹的操作
在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:
- 导入os模块
import os
- 使用
os
模块相关功能
os.函数名()
文件重命名
os.rename(目标文件名, 新文件名)
删除文件
os.remove(目标文件名)
创建文件夹
os.mkdir(文件夹名字)
删除文件夹
os.rmdir(文件夹名字)
获取当前目录
os.getcwd()
改变默认目录
os.chdir(目录)
获取目录列表
os.listdir(目录)
应用案例
需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。
- 步骤
-
设置添加删除字符串的的标识
-
获取指定目录的所有文件
-
将原有文件名添加/删除指定字符串,构造新名字
-
os.rename()重命名
- 代码
import os
设置重命名标识:如果为1则添加指定字符,flag取值为2则删除指定字符
flag = 1
获取指定目录
dir_name = ‘./’
获取指定目录的文件列表
file_list = os.listdir(dir_name)
print(file_list)
遍历文件列表内的文件
for name in file_list:
添加指定字符
if flag == 1:
new_name = ‘Python-’ + name
删除指定字符
elif flag == 2:
num = len(‘Python-’)
new_name = name[num:]
打印新文件名,测试程序正确性
print(new_name)
重命名
os.rename(dir_name+name, dir_name+new_name)
总结
-
文件操作步骤
-
打开
文件对象 = open(目标文件, 访问模式)
-
操作
-
读
文件对象.read()
文件对象.readlines()
文件对象.readline()
- 写
文件对象.write()
-
seek()
-
关闭
文件对象.close()
-
主访问模式
-
w:写,文件不存在则新建该文件
-
r:读,文件不存在则报错
-
a:追加
-
文件和文件夹操作
-
重命名:os.rename()
-
获取当前目录:os.getcwd()
-
获取目录列表:os.listdir()
面向对象基础
理解面向对象
面向对象是一种抽象化的编程思想,很多编程语言中都有的一种思想。
总结:面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。而编程就是设置事物能够做什么事。
类和对象
在面向对象编程过程中,有两个重要组成部分:类 和 对象
类和对象的关系:用类去创建一个对象。
理解类和对象
类
类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的事物。
-
特征即是属性
-
行为即是方法
对象
对象是类创建出来的真实存在的事物
注意:开发中,先有类,再有对象。
面向对象实现方法
定义类
Python2中类分为:经典类 和 新式类
- 语法
class 类名():
代码
…
注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯。
- 体验
class Washer():
def wash(self):
print(‘我会洗衣服’)
- 拓展:经典类
不由任意内置类型派生出的类,称之为经典类
class 类名:
代码
…
创建对象
对象又名实例。
- 语法
对象名 = 类名()
- 体验
创建对象
haier1 = Washer()
<main.Washer object at 0x0000018B7B224240>
print(haier1)
haier对象调用实例方法
haier1.wash()
注意:创建对象的过程也叫实例化对象。
self
self指的是调用该函数的对象。
1. 定义类
class Washer():
def wash(self):
print(‘我会洗衣服’)
<main.Washer object at 0x0000024BA2B34240>
print(self)
2. 创建对象
haier1 = Washer()
<main.Washer object at 0x0000018B7B224240>
print(haier1)
haier1对象调用实例方法
haier1.wash()
haier2 = Washer()
<main.Washer object at 0x0000022005857EF0>
print(haier2)
注意:打印对象和self得到的结果是一致的,都是当前对象的内存中存储地址。
添加和获取对象属性
对象属性既可以在类外面添加和获取,也能在类里面添加和获取。
类外面添加对象属性语法
对象名.属性名 = 值
- 体验
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!