Ox00 前言

本文首发于 语雀笔记

Ox01 基础知识

  • Python中变量的特点

    • Python是一个解释型的动态语言。

      • 解释型: 它是运行在 PVM 中,指令是逐条翻译执行的

      • 动态语言: 变量类型是在运行中确定的,并且变量类型可以改变

    • Python中的变量可以看作是一个 void* 指针,指向了实际的数据

  • 基本变量类型

    • float: 浮点数

    • int: 整数

    • str: 字符串 '' "" """三引号可以保留格式"""

  • 命名规范

    • 和C语言的命名规范一样
  • 输入和输出

    • Python3:

      • input(""): 返回的始终是字符串

      • eval(input("")): 返回的是实际输入的类型

    • Python2

      • input: 和3中的eval(input(""))一样

      • raw_input: 和3中的input一样

    • 在 Python2中,print是一个表达式,3中,print是一个函数

      • 2: print 123

      • 3:print(123)

    • 格式化输出

      • print("%d %f" % (10, 10.0)) # 使用%进行输出

      • print("{0} {1:10.8f}".format(10, 10.0))

  • Python中的缩进

    • Python中使用缩进标识代码块,不当的缩进会导致异常

Ox10 Python

运算符和表达式

  • and or not
    • 与或非,返回的结果是True|False
  • / //
    • /: 表示直接进行除法运算
      • 在Python2中,会根据类型保留小数
      • 在Python3中,始终都会保留小数
    • //: 截断除法
      • 无论如何都会舍去小数
  • **
    • 幂运算
  • in not in
    • 成员关系运算符,判断当前的值是否在一个序列中
    • if ('a' in "abc") => True
  • is ==
    • is: 判断两个变量的地址是否相等    l1 = l2   l1 is l2 ?
    • ==: 判断值是否相等
  • !=    <>
    • Python2 中 <> 表示不等,Python3废除
  • 为  False 的一些表达式
    • if ("")
    • if ([])
    • if ({})
    • if ((,))
    • if (False)
    • if (0)

1. 元组

  • 元组(不可变的)
    • 定义: 关键是 , a = 1, 2 => (1, 2)

    • 元组分解(解包)

      • 将元组分解出每一个部分进行赋值,可以用于交换两个数
        • a = 2;b = 3; a, b = b, a;

2. 列表

  • 定义: 关键是 [], a = [1]

  • 列表的深拷贝

    • 默认的赋值时浅拷贝,修改任意一个,都会影响其它的

    • 使用 list.copy() 函数可以进行列表的深拷贝

  • 列表生成式

    • [s.lower()*2 for s in "12Bcd%^&dsad" if s.isalpha()]

      • bb cc dd dd ss aa dd
    • 从一个列表中筛选出所有的字符串并转换为小写


3. 可变类型

  • 区分条件:修改数据的时候是否会改变地址,使用 id 查看地址

  • 可变类型:

    • 字典、列表
  • 不可变类型

    • int float str tuple

4. 字典

  • 定义:关键是 { 键:值 }, d = {1:"111", 2:"222"}

  • 键和值的要求

    • 键(下标): 必须是不可变类型

    • 值: 无所谓

  • 获取键值对、键、值

    • dict.items

    • dict.keys

    • dict.values


5. 分支和循环

  • 顺序结构

  • 自上而下

  • 选择结构

  • if elif else: 使用上和c语言的一样

  • 循环结构

    • for 元素 in 可迭代序列(列表 字典 元组 字符串 集合)

      • 遍历字符串

        • ss = "123456"

        • for s in ss:

        • ...     print(s)
      • 遍历元组

        • t = 1, 2, 3, 4, 5, 6

        • for item in t:

        • ...     print(item)
      • 遍历列表

        • l = [1, 2, 3, 4, 5, 6]

        • for item in l:

        • ...     print(item)
      • 遍历字典

        • d = {1:"111", 2:"222"}

        • for k,v in d.items():

        • ...     print(k, v)
      • for break else

        • 当for循环被break,就不执行 else
      • 当for循环正常退出,则执行else代码

    • while

      • while 表达式: 缩进的代码
    • range

      • 返回一个范围内的数据
      • range(a, b, c)
        • a: 数据的起始位置
        • b: 数据的结束位置的后一个
        • c: 步长
      • range(10, 30, 3)
        • 10 13 16 19 22 25 28

切片操作

  • 谁可以使用切片操作
    • 列表和字符串可以使用切片操作

      • str[a : b : c]: abc的含义同range len(s)
    • 反转一个字符串

      • "123456789"[::-1] \ reverse()

6. 函数

函数

  • 函数的定义

    • def 函数的名称 (函数的形参):
      函数体 pass
  • 函数的返回值

    • 函数的返回值使用return返回

    • 函数的原型中不需要提供返回值

    • 函数没有使用return会返回 None

  • 参数的传递

    • 支持默认参数,支持给指定参数进行赋值 hosts="xxxx", __ add __

    • 直接传值 def show(item)

    • 传元组 def (*args), 传入的数据不能改变

    • 传字典 def (**kwargs) ,传入的数据可以被改变

  • 空函数:什么也不做的函数

    • def func():
      pass
  • 全局变量和局部变量

    • 使用 locals() 查看局部变量

    • 使用 globals() 查看全局变量

    • global

      • 在函数中想要使用全局变量,需要在使用前使用 global进行声明

      • 在函数中可以使用 global 定义一个全局变量

  • 实现一个main函数

    • if __name__ == "__main__"
      • 主模块就是直接被运行的模块,否则就是通过 Import 被导入的模块

      • 当前模块为主模块的时候,name 才是 **main **

      • 当前模块是被加载的模块,name是模块名

  • 匿名函数

    • lambda: 创建一个没有名字的函数

      • 函数内不可以有多条语句

      • 函数体不可以换行

    • 不能写return 表达式的值就是返回值

  • lambda a,b : a if a > b else b
    一个用于比较大小的匿名函数


闭包

...

高阶函数的使用

  • reduce:

    • 在Python3中,不再内置reduce函数,被放在了 functools模块中

    • reduce(匿名函数,一个序列)

      • 将序列中的值依次放入指定函数,将函数的返回值作为一个参数和下一个值继续进行运算

      • functools.reduce(lambda a, b: a + b, a)

  • map:依次对传入的序列调用指定的函数

    • map(函数,序列1,序列n)
      • 将每一个序列对应位置的数据传入到函数中,将返回的结果重新生成一个序列

a = ['1', '2', '3', '4', '5']
b = ['a', 'b', 'c', 'd', 'e']
list(lambda v1, v2: v1 + v2, a, b)

  • filter:过滤传入的序列生成一个新的序列
    • filter(函数,序列)

    • 将序列内的数据依次放入函数中,将返回值为True的数据,重新组合成一个的列表

b = ['abc', '123', '456', 'def', 'efg']
filter(lambda s: s.isdigit(), b)


类的使用

  • 类的定义

    • class 类名(父类): 父类是 object
  • 类属性和实例属性

    • 实例属性:

      1. 使用 self 或者实例名称可以添加实例属性

      2. 实例属性只能通过实例进行访问

    • 类属性:

      1. 使用 cls 或者类名可以添加类属性

      2. 使用实例不可以修改类属性, 但是可以访问

        1. 使用实例修改类属性相当于添加了一个同名的实例属性
      3. 推荐使用类名来访问类属性

  • 方法的种类

    • 实例方法:

      • 第一个参数始终表示当前的对象,名称通常为 self
    • 类方法

      • 第一个参数始终为 cls

      • @classmethod

    • 静态方法

      • 静态方法对参数没有要求

      • @staticmethod

    • 静态方法和类方法在使用上没什么区别

  • 类的继承

    • class 类名(父类1, 父类2):

    • 在Python3中,所有的类的基类都是 object

    • 通过 isinstance 可以查看一个实例或类型是否是另一个类的子类---------------------------------------------

    • 在Python中,子类不会主动调用父类的构造函数

      • super(子类, self).__ init __()

      • super().__ init __()

      • 父类名称.__ init __(self, 参数)

  • 构造函数和析构函数

    • 构造的名字: __ init __

    • 析构的名字: __ del __

  • Python 的类不会产生二义性,会采用就近原则(继承链)

    • 通过 Test.mro() 可以查看继承链

7. 面向对象

  • 封装性
    • 单下划线  : 模块间私有(只能在本模块内访问到)
    • 双下划线 : 模块内私有(只能在类内被访问到)
  • 继承

8. 模块导入方式

  • 模块的命名

    • 模块的名字中不能包含中文字符,不能是纯数字
  • 模块的导入

    1. import XXX

    2. from functools import reduce 推荐使用的

    3. from functools import *

  • 线程模块

    • threading

    • Thread(target=线程的起始位置,name="线程名称", args=(元组), kwargs={字典})

    • python中的线程是伪线程,并且递归的次数有限制,不建议使用递归

  • 网络模块

    • import socket
  • 随机数模块

    • import random

    • randrange() 返回只当范围的数

    • randint() 返回指定范围的数


9. 常用模块

  • 字符串操作
  • 目录路径
  • 日期时间
  • 随机数

10.异常处理

  • try :在可能产生异常的代码中捕获异常

  • except :捕获到了异常就处理异常

  • else :当没有捕获到异常的时候,会执行else

  • finally:无论有没有产生异常,都执行

  • raise:抛出一个指定的异常

# 捕获所有类型的异常并打印异常的信息
try:
    可能产生异常的代码
except Exception as e:
    print(e)

Ox20 MySql

1. 创建数据库

  • create database 数据库名;

2. 创建数据表

  • create table 表名( 字段名 字段类型 , 字段名2 字段类型2 );

3. 数据表操作

  • 插入数据
    • insert into 表名 (字段列表)  values(值列表);
  • 更新数据
    • update 表名 set 字段名=字段的值 where 条件;
  • 删除数据
    • delete 表名 where 条件;
  • 查询数据
    • select * from 表名;

Ox30 SQL语法

  • SQL约束

    • 主键(PRIMARY KEY): 唯一标识数据库表中的每条记录,通常有且只能有一个

    • 外键(FOREIGN KEY):一个表中的外键通常绑定到另一个表的主键,可以有多个。

    • 唯一(UNIQUE): 规定该字段的数据是唯一的,可以有多个。

    • 非空(NOT NULL): 规定该字段不能为NULL,可以有多个。

    • 默认(DEFAULT):指定当不设置数据时的默认值,可以有多个。

    • 检查(CHECK): 用于检查设置的值是否合理,可以有多个。

  • 数据库指令

# 创建一个不存在的数据库并指定编码
CREATE DATABASE IF NOT EXISTS test;

# 删除一个已存在的数据库
DROP DATABASE IF EXISTS test;

# 显示所有的数据库
SHOW DATABASES;
  • 表操作指令
# 创建一个表
Create table 表名
(
	Id		int				primary key,					#主键约束
	Name	varchar(20)		unique,							#唯一约束
	Age		int				not null,						#非空约束
	Sex		varchar(5) 		check(Sex=’男’ or Sex=’女’),	   #检查约束
	Ethnic	varchar(5)		default  ’汉’					#默认约束
);


# 显示所有表
SHOW TABLES;

# 删除一张表
DROP TABLE name;

# 修改列名以及属性名
ALTER TABLE table4 CHANGE name2 char(20);

# 删除一个已存在的列
ALTER TABLE table4 DROP name3;
  • 项操作指令
# 向表中指定字段添加数据
INSERT INTO name(column1, column2) VALUES (value1, value2);

# 向表中添加多列数据
INSERT INTO name(column1, column2) VALUES (1,2),(3,4);

# 更新表中指定字段的所有数据
UPDATE name SET column = xxx;

# 更新表中满足条件的指定字段
UPDATE name SET column = xxx [WHERE];

# 删除表中的指定列
DELETE FROM 表名 [WHERE];

# 删除表中所有数据
delete from 表名;
  • 查询数据
# 查询表中的所有记录
SELECT * FROM 表名;

# 查找指定字段
SELECT 字段名 FROM 表名;

# 条件查询
# 常见的比较运算符有: > < <= >= = <>
# 可以使用 and or not 组成多个条件的判断
SELECT 字段名 FROM 表名 WHERE 字段名 = ?;

# 模糊查询: % 匹配任意长度字符
select * from 表明 where name like '1%2'

# 模糊查询: _ 匹配任意一个字符
select * from 表明 where name like '_M_'