二十七. Python

144 阅读9分钟

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) 抽象类
含有抽象方法的类 叫抽象类,

15 MySQL