1.入门
1.1 计算机基础
(1) 计算机的组成
要实现计算机编程,首先需要明确计算机的组成. 计算机主要分为硬件和软件两个部分, 而我们写代码,主要就是实现软件层面的功能.
(2) 什么是计算机
计算机(computer)俗称电脑, 是现代一种用于高速计算的电子机器,可以进行数值计算,又可以进行逻辑判断,还具有存储记忆功能,且能够按照程序的运行,自动 高速处理数据.
(3) 计算机是由什么组成的?
硬件系统:
CPU 内存 (主机部分)
硬盘 主板 电源 U盘 键盘 鼠标 摄像头 显示器 音箱 打印机(外设部分)
软件系统: 系统软件, 应用软件
1.2 python简介
- 1989年,为了打发圣诞节假期, Gudio van Rossum吉多.范罗苏姆(龟叔,荷兰人)决心开发一个新的解释程序
- 1991年,第一个Python解释器诞生
- Python这个名字,来自龟叔所挚爱的电视剧Monty Python's Flying Circus
1.3 Python 安装
1.4 Python解释器
- 计算机只认识 0 1,
- 用Python解释器将Python代码解释成0101....
- 创建一个 abc.py 文件
- 命令: python d:\abc.py 就执行了这个文件
1.5 Pycharm安装
- 交互式编程: 终端编写python代码, 就是REPL循环环境:读 运行 打印 循环. 或者在pychartm的 pythonConsole里可以使用交互式编程.
2. Python基础语法
2.1 Python常用的6种数据类型
(1) 数字 Number
int
float
complex 4+3j
bool
(2) 字符串 String
(3) 列表 List
(4) 元组 Tuple
(5) 集合 Set
(6) 字典 Dictionary
2.2 Python中的注释
单行注释 # 内容
多行注释 """ 内容 """
多行注释 ''' 内容 '''
2.3 Python中的变量
a = 56
a = a - 10
print("总金额: ", a, "元")
type(a)
2.4 数据类型转换
int(x)
float(x)
str(x)
2.5 标识符 和 关键字
- 字母 数字 下划线, 不能数字开头
- 大小写敏感
- 不可以使用关键字
2.6 运算符
(1) 算术运算符
+
-
/ 除法 float
// 整除
% 取模
** 次方
(2) 赋值运算符
=
+=
-=
/=
%=
**=
//=
2.7 input语句
name = input("你的名字?") # 拿到的是字符串
print(name)
print(name, end='') 就不会换行了
\t制表符
2.8 字符串
(1) 定义
name = ' 你好,tom,klsdfjlsdj2134 '
name2 = "你好"
name3 = """你好"""
引号里边有引号 可以用转义字符, 或者 单双引号互相嵌套
(2) 字符串拼接
+ 号
字符串与字符串拼接
数字与字符串,不能直接用加号拼接
(3) 字符串格式化
num = 100
name = "tom"
msg = "我的学号是: %s, 我的名字是: %s" % (num, name)
其中%表示我要占位了,
s表示将变量变成字符串之后 放入占位的地方.
(4)
num = 100
age = 3
msg = "我的学号是: %s, 我的年龄: %d" % (num, age)
%d , 将内容转换成整数,放入占位的位置
%f , 将内容转换成浮点型,放入占位的位置
(5) 数字精度的控制
%m.nf
m, 控制宽度, 要求是数字, 设置的宽度小于数字自身是不生效的
n, 控制小数点精度, 要求是数字, 会进行小数的四舍五入
%5d: 表示将整数的宽度控制在5位, 如数字11, 被设置为5d,就会变成: [空格][空格][空格]11
%7.2f: 表示将宽度控制为7, 将小数点精度设置为2, 小数点和小数部分也算入宽度计算.
如11.345的结果为, [空格][空格]11.35
(6) 快速格式化字符串
f"内容{变量}的格式 来快速格式化字符串"
(7) 方法
取值: 字符串是不可以被更改的
name[2]
name[-3]
下标查找: name.index("tom")
替换: name.replace("tom", "jack") # 返回一个新的字符串
分隔: name.split(",") # 得到列表
去空格: name.strip('指定的字符串')
统计: name.count("to") # 统计某个出现的次数
长度: len(name)
3 判断语句
3.1 布尔类型bool
- True,False
3.2 比较运算符
==
!=
>
<
>=
<=
3.3 if
if
if else
if elif else
if age >= 18:
print("我已经成年了")
4. 循环语句
4.1 while循环
i = 0
while i<100:
print("你好")
i += 1
4.2 for循环
name = 'tom'
(1)
for i in name:
print(f'我是i的值: {i}')
这个name必须是序列类型, 包括字符串 列表 元祖 ...
(2) rang语句
range(5) 5是长度, 得到序列类型的数据,[0,1,2,3,4]
range(5,10) 得到 [5,6,7,8,9] 包左不包右
range(5,10,2) 得到 [5,7,9] 这个2是步长
(3)
continue
break
5. 函数
- 函数是组织好的,可重复使用的,用来实现特定功能的代码块. 例如len() 函数,求长度.
5.1 函数的定义和参数
def myFun(data, name, age=13,*args, **kwargs):
"""
函数说明
:param data: 传入的字符串
:return: 返回值的说明
"""
count = 0
for i in data:
count +=1
print(f"字符串{data}的长度是{count}")
return
位置参数: myFun("sdfsd", "tom", 18)
关键字参数: myFun(data="sdfsd", name="tom", age=18) 关键字参数可以是乱序的
缺省参数: 可以设置默认值如 age=13
不定长参数:
位置传递的不定长, 会被合并成一个元组
关键字传递的不定长, 会被合并成一个字典
如果函数没有使用return, 函数默认返回None, None类型是<class 'NoneType'>
5.2 函数的作用域
全局变量和局部变量, global
name = 'kobe'
def myAdd():
num =100
global age = 16 # 声明全局变量
print(num)
myAdd()
print(num) 报错
5.3 函数返回值
def myFun():
return 1,2,"tom"
返回值 整体的类型是tuple
5.4 匿名函数
lambda x,y : x+y
6.数据容器
- 一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素, 每一个元素可以是任意类型的数据.
6.1 列表
(1) 定义
list = ["aaa","bbb","ccc"]
list[1]
list[-2]
(2) 列表的方法
list.index("bbb") # 通过元素查找其下标, 如果查找的元素不存在会报错
list[2] = "fff" # 修改
list.insert(1, "best") # 插入
list.append(4) # 追加单个
list.extent([3,4,5]) # 追加一批
del list[2] # 用下标删除
ele = list.pop(2) # 用下标删除
list.remove('aaa') # 元素删除
list.clear() # 列表被清空
list.count(元素) # 统计某元素出现的次数
len(list) # 列表长度
(3) 列表的遍历
index = 0
while index < len(list):
print(list[index])
index+=1
for i in list:
print(i)
6.2 元组
- 列表可以修改, 元组不能修改 (浅不可更改)
(1) 定义
t1 = ("aaa", "bbb", "ccc", "ddd", "eee")
t2 = tuple()
t3 = ()
如果元组只有一个元素 要在后边写上逗号, t4 = ('tom', )
(2) 方法
t1.index("bbb") # 通过元素查找其下标, 如果查找的元素不存在会报错
t1.count(元素) # 统计某元素出现的次数
len(t1) # 列表长度
(3) 遍历
index = 0
while index < len(t1):
print(list[index])
index+=1
for i in t1:
print(i)
6.3 切片
- 序列是指 : 内容连续,有序,可使用下标索引的一类数据容器. 列表 字符串 元组
序列[起始下标:结束下标:步长] 步长可以是负数吗
list2 = [3,4,5,6,76,87,23,4]
list2[1:4]
list2[1:4:-1]
6.4 set集合
(1) 定义
s1 = { "aaa", "bbb", "ccc" }
s2 = { "aaa", "hhh", "fff" }
s3 = set()
(2) 方法
s1.add("python") # 添加
s1.remove("ccc") # 删除
s1.pop() # 取出一个值, 随机取
s1.clear() # 清空
len(s1) # 长度
差集:
s4 = s1.difference(s2) s4 为{"bbb","ccc"}, s1和s2不变
s1.difference_update(s2) 结果s1变为{"bbb","ccc"}, s2不变
合集:
s1.union(s2) # s1的结果为 { "aaa", "bbb","ccc", "hhh", "fff" }
遍历
for i in s1:
print(i)
6.5 字典
(1) 定义
d1 = { "王": 88, "李":34, "赵": 90 }
d3 = {}
d4 = dict()
key和value可以是任意数据类型(key不可以为字典)
(2) 方法
d1["张"] = 98 # 新增或修改
score = d1.pop("王") # 删除一个元素
d1.clear() # 清空
len(d1) # 元素数量
d1.keys() # 拿到所有的key
for key in keys:
print(key)
print(keys[key])
for key in d1:
print(key)
6.6 数据容器对比
- 性质对比
(1) 是否支持下标索引
支持: 列表,元组,字符串
不支持: 集合,字典
(2) 是否支持重复元素
支持:列表, 元组, 字符串
不支持: 集合, 字典
(3) 是否可以修改
支持: 列表,集合,字典
不支持: 元组, 字符串
(4) 数据有序:
有序: 列表, 元组, 字符串
无序: 集合, 字典
- 通用操作
len() 元素个数
max() 最大元素
min() 最小元素
list(容器) 在字典转列表时,会将value通通抛弃掉, 只剩下了我们的key
str(容器) 字典转字符串时, value都保留下来了
tuple(容器) 在字典转元组时,会将value通通抛弃掉, 只剩下了我们的key
set(容器) 在字典转集合时,会将value通通抛弃掉, 只剩下了我们的key
dict(d1)
sorted(容器, [reverse = False]) # 排序
在字典排序时,会将value通通抛弃掉, 只剩下了我们的key
7. Python的文件操作
7.1 文件的编码
- 如何将内容翻译成二进制,可以使用编码规则
- 如,UTF-8, GBK, Big5
7.2 文件操作
(1) 打开文件
open(name, mode, encoding)
f = open('python.txt', 'r', encoding="UTF-8")
(2) 读取文件
f.read(10)
f.read()
(3) 读取每一行
f.readLines() 读取的文件全部封装在列表中
(4) 循环
for line in f:
print(line)
(5) 文件关闭
f.close()
(6) with open("python.txt","r") as f:
f.readlines()
可以自动close
(7) 写入
f.write("hello world") # 写入到了python程序运行的系统内存中, 不是写到硬盘中.
f.flush() 写入到硬盘中, 相当于 Ctrl+s
f.close() 里边内置了flush() 的功能
w模式下,写入文件是将 之前的都覆盖掉
(8)
r只读, 文件不存在,不会帮我们创建
w只写, 文件不存在,会帮我们创建
a追加,
8 异常,模块,包
8.1 异常
- 当我们检测到一个错误时, python解释器就无法继续执行了, 反而出现了一些错误的提示,这就是所谓的异常, 也就是我们所说的bug
(1) 捕获所有
try:
f = open('linux.txt', 'r')
except:
print("出现了异常了")
或者
try:
f = open('linux.txt', 'r')
except Exception as e:
print("出现了异常了")
(2)捕获某个
try:
print(m)
except NameError as e: # 只会捕获未定义的异常
print("出现了变量未定义的异常")
(3)捕获多个
try:
print(m)
except (NameError, ZeroDivisionError) as e:
print("出现了异常")
(4)
try:
f = open('linux.txt', 'r')
except Exception as e:
print("出现了异常了")
else:
print("如果没有出现异常,执行")
finally:
print("无论是否 出现异常,都会执行")
(5) 异常的传递性
9. Python的模块
- 模块module就是一个 python文件,以.py结尾. 模块能定义函数,类和变量,模块里也能包含可执行的代码.
9.1 模块的导入
[from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]
常用的组合形式如:
import 模块名
import 模块名 as 别名
from 模块名 import 类,变量,方法
from 模块名 import *
from 模块名 import 功能名 as 别名
9.2 自定义模块
-
文件名就是模块名
-
不同模块有同名函数时,后倒入的优先级高
-
from myModule import test 导入的时候 默认执行myModule里边的代码
-
需求: 导入的时候不想执行myModule里边的代码, 用到的时候再执行, 怎么实现?
使用 __main__
Python的文件他内置都会有一个变量 __name__
右键运行他,这个名字就会标记为__main__
- all变量
__all__ 决定了 * 能导入哪些内容
9.3 Python包
- 从物理上看,包就是一个文件夹,在该文件夹下包含了一个__init__.py, 该文件夹可用于包含多个模块文件,从逻辑上看,包的本质依然是模块.
- 包的作用: 当我们的模块文件越来越多时, 包可以帮我们管理这些模块, 包的作用就是包含多个模块,但包的本质依然是模块.
- 安装第三方包
pip install 包名
pip install -i 网址 包名
10. 对象
10.1 基础
定义在类内部的函数叫做方法
(1)定义:
class Person:
def __init__(self, name, age, tel):
self.name = name
self.age = age
self.tel = tel
# 其他的内置方法
__str__ 字符串方法
__lt__ 比大小
__le__ 比大小等
__eq__ 比等于
# 实例方法
def say(self):
print("abc")
# 类方法 (只访问类属性的方法)
# 静态方法 (既不访问类属性也不访问实例属性)
# 私有方法 (不允许被外部访问的方法) 以两个下划线开头
(2) 继承
(3) 类型注解
联合类型 union[str,int]
(4) 多态
(5) 抽象类
含有抽象方法的类 叫抽象类,