Python 学习笔记

一、python 编码规范

  1. 使用必要的空行可以增加代码的可读性

  2. 应该避免在循环中使用累加,避免创建不必要的临时对象

  3. python中严格区分大小写

  4. python采用代码缩进和:区分代码之间的层次(一个Tab是一个缩进量)

  5. 顶级定义之间空两行, 比如函数或者类定义. 方法定义, 类定义与第一个方法之间, 都应该空一行.

  6. 在文件和sockets结束时, 显式的关闭它。不然可能会消耗有限的系统资源,或者后续的增删改查操作,或者可能会被其共享的程序在无意中进行读或者写操作,产生异常。

  7. 同一文件夹,不能有相同的文件名,但不同文件夹中的文件可以重名。

二、python 命名规则

  1. 命名空间查找顺序:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。

  2. 作用域就是一个 Python 程序可以直接访问命名空间的正文区域。在python中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,访问顺序为:当前域 -> 外部域(如果有) -> 全局域 -> 内置域。

  3. 模块名(方法名)尽量短小,采用小写字母开头,可以使用_分隔单词(函数、类的属性和方法同是),如:lower_with_under.py

  4. 类名使用驼峰命名法,如:CapWords

  5. 模块内部的类可以使用:_类名(受保护的类,不可以被导入,类本身和子类可以使用),__开头的实例变量或方法是私有的类(只能类本身使用,其他方式时:实例名._类名__xx)

  6. 标识符文件命名:a-z,A-Z,数字,_(第一个不能是数字)

  7. __init__标识构造函数(双划线标识python的专用的标识)

三、列表、元组、字典、集合


'''
\-->续行符
\n-->换行符
\0-->空
\t水平制表符
\"双引号
\\反斜杠
'''

# List基础用法
list1 = ['new', 3, "str", 5, 2]
print(list1[0])  # 输出第一项

list1.append('test')  # 添加元素
print(list1)  # 输出全部项

print(list1[-1])  # 输出最后一项

print(list1[::2])  # 间隔一项输出

print(len(list1))  # 统计列表元素个数

# List排序
list2 = [2, 4, 6, 8, 1, 4]
list2.sort()  # 小到大排序
print(list2)

list2.sort(reverse=True)  # 大到小排序
print(list2)

# List去重
del_redata = list(set(list2))  # 去重后的数据是放在字典里面的,所以需要list强制转换为列表
print(del_redata)

# enumerate可以同时输入索引值和元素内容
for index, item in enumerate(list2):  
    print(index, item)

del list2[-1]  # 删除列表
print(list2)

list2.remove(4)  # 删除指定元素
print(list2)

# Tuple用法
tuple1 = ("元组1",)
print(tuple1[0])

#元组与列表的区别
"""
1. 列表中的元素值可以变更,元组中的元素值是不允许修改的
2. 列表不能作为字典的键,而元组可以
"""

# 字典用法
"""
1. 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
2. 键必须不可变,所以可以用数字、字符串或元组充当,而用列表就不行
"""

dict1 = {'jack': 15181002299, 'rose': 15181001199}
for key, value in dict1.items():
    print(key + '的联系电话为:' + str(value))  # 遍历输出dict的值

print(dict1.keys())  # 输出dict所有的key值

dict1.pop('jack')  # 删除字典元素或 del dict['rose']
print(dict1)

print(dict1.get('rose'))  # 获取key的值

print(type(dict1))  # 查看变量类型

# 集合用法
"""
1. 集合和列表相差不大,定义符号{},只是值不允许重复
2. 添加-->add()
3. 交集使用&,并集使用|,差集使用-
"""

四、字符串的用法

  1. 计算长度:len(str)
  2. 编码:str.encode('gbk'),默认UTF-8(汉字3-4个字节,gbk–2个字节),解码:decode()
  3. 截取字符串:str[start:end:step]
  4. 分割字符串:str.split('分隔符',[分割次数])#默认采用分隔符–Tab分割
  5. 合并字符串:'迭代对象'.join(元组/列表)

a="_"
b=("a","b","c")
print(a.join(b))
  1. 统计字符出现次数:str.count('统计字符')
  2. 字符出现的索引位置:str.find('查找字符')—>rfind/rindex()从右边查找
  3. 字符是否存在print('@' in str) #返回Ture或False
  4. 是否以指定子字符串开头:str.startswith('@') #返回Ture或False
  5. 是否以指定子字符串结尾:str.endswith('@')
  6. 大写字母转为小写字母:str.lower()
  7. 小写字母转为大写字母:str.upper()
  8. 去掉左右空格和特殊字符:str.strip() #特殊字符包括:制表符\t、换行符\n、回车符\r
  9. 去掉左空格和特殊字符:str.lstrip()
  10. 去掉右空格和特殊字符:str.rstrip()
  11. 格式化字符串:%s%dstr.format()

%s:打印字符串,%d:打印数字,%r:不知道打印什么类型的信息,可以用%r表示

五、正则表达式

1、正则表达式匹配符

^:表示行的开头
$:表示行的结尾
.:匹配任意字符(除换行符以外)
\w:匹配字符或数字或下划线或汉字
\s:匹配任意的空白符
\d:匹配数字
\b:匹配单词的开始和结束
?:0次或1次
*:零次或多次
+:1次或多次
{n}:匹配前面的字符n次
{n,}:匹配前面的字符最少n次
{n,m}:匹配前面字符最少n次,最多m次

2、正则表达式用法

  1. 排除字符:[^a-z|A-Z]
  2. 分组:(a|b)th
  3. 匹配字符串:re.match(匹配规则,匹配字符串,re.I)
  4. 匹配字符串:re.search(匹配规则,匹配字符串,re.I)

line = "Cats are smarter than dogs";

#re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;re.M:多行模式,re.I:不区分大小写
matchObj = re.match( r'dogs', line, re.M|re.I)
print(matchObj)

#re.search匹配整个字符串,直到找到一个匹配
matchObj = re.search( r'dogs', line, re.M|re.I)
print(matchObj)
  1. 删除字符串:re.sub()
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub(r'\D', "", phone)
print("电话号码是 : ", num)
  1. 分割字符串:re.split()

六、函数


#定义函数
def function_name(可选参数):
    pass

1、函数的参数

  1. 形式参数:定义函数时,后面跟的参数
  2. 实际参数:调用函数时,后面跟的参数
  3. 位置参数:数量与定义一致,位置与定义一致(除非指定参数名=实际值)
  4. 关键字参数:定义关键字,位置可以不一致

方法名.defaults:查看方法参数据设置的默认值(位于所有参数最右侧),但默认值必须是不可变的对象,如:None

  1. 可变参数

*parameter:接收任意多个实际参数并将其放到一个元组中,组成一个tuple对象

**parameter:接受任意多个类似关键字参数一样显式赋值的实际参数,组成一个dict对象

2、函数的变量

  1. 局部变量:定义在函数体内部的变量,只能在函数内部使用
  2. 全局变量:内部外部皆可以使用,但是如果内部更改该变量并不会影响外部定义的变量值,但是如果加global修饰,内部修改则会影响外部的变量值(但一般情况下不建议局部变量和全局变量名称相同)

3、匿名函数

匿名函数(lambda,应用于不需要指定名字的函数)

参数可以多个,但表达式只能有一个:r:math.pirr,通过r去调用这个函数

七、面向对象

面向对象的定义

  1. 对象:一切实体皆可以是对象,如:人(在python中,一切皆对象)
  2. 类是封装对象的属性和行为的载体
  3. 面向对象的三大基本特征:
  • 封装:就是将对象的属性和行为封装成类,保护内部的数据结构
  • 继承:重复利用的重要手段,子类继承复用了父类的属性和行为,且同时拥有自己特有的属性和类
  • 多态:子类继承父类,但同时又拥有各自不同的特有属性和行为

#定义类
class classname(可选参数/父类名):
    hello="我是类属性"
    
    @property 
    #将方法转换为属性,调用时不需要加(),不过被转换后的属性不能重新被赋值,相当于只读,@setter方法可以让属性被修改
    def __init__(self,hello):
        classname.hello #调用类属性
        
        world="我是实例属性"
        self.world #调用实例属性
        self.hello=hello #此处的self是申明hello可以被其他方法调用

#init是python中一个特殊的方法,创建新实例时,自动执行,相当于java的构造函数

#self指向实例(类中的一个行为)本身的引用,用于访问类中的属性和方法

#在子类中使用父类的方法,需要初始化:super.functionname()

八、模块和包

1、模块的定义

  1. 一个python文件就是一个模块
  2. 一个文件夹就是一个包:pip install 包名----- pip list 安装的包 #查看安装的包
  3. 模块主要分为三类:
  • python安装后自带的模块,如:unittest、time等
  • 通过第三方安装的模块:selenium、flask等
  • 自己开发的模块–不能与python自带的模块重名,否则python自带的模块就不会被导入(跨目录导包,可以添加到系统的path文件:sys.path)

2、python导包的方式

  1. import导包时,尽量避免一次导入多个模块,如:import sys,os
  2. from 模块名称 import 变量/函数/类/*
    3.#dir()可以查看具体的函数名称
    需要保证在当前命名空间是唯一的,否则会被后面后导入的覆盖,这时就要使用import

3、模块查找规则

  1. 在py文件所在的当前目录
  2. 到pythonpath(环境变量)下的每个目录查找
  3. python默认安装目录
  • 以上各个目录的具体位置保存在标准模块sys的sys.path变量中。
  • 临时添加目录:sys.path.append(filepath)

注:

  • 如果调用的方法名太长,可以使用as指定别名
  • if __name__=='__main__':name是记录模块名称的变量,main是指在name变量中为顶级模块)

九、异常处理

1、异常类型

  • NameError:尝试访问一个没有声明的变量
  • IndexError:索引超出范围
  • IndentationError:缩进错误
  • ValueError:传入值错误
  • KeyError:请求一个不存在的字典关键字
  • IOError:输入输出错误,如读取文件不存在
  • ImportError:import语句找不到模块
  • AttributeError:访问位置对象属性
  • TypeError:类型不合适
  • MemoryError:内存不足
  • ZeroDivisionError:除数为0

2、异常的定义

# 异常的使用
try:
    fuctionname()
except (异常A,异常B) as e:
    print("操作1")
else:
    print("操作2")finally:
    print("都会执行")

# 异常的调试
assert A>B,"异常信息"

except AssertionError as e:
    print(e) #抛出异常信息

十、文件操作

1、文件参数类型

  • r:只读模式打开文件
  • rb:以二进制格式,使用只读模式打开文件
  • w:只写模式打开文件
  • wb:以二进制格式,使用只写模式打开文件
  • a:以追加模式打开文件,如无文件则创建
  • ab:以二进制格式打开文件,并采用追加模式
  • +:添加读写模式打开文件,如w+(可读可写)

2、文件的用法


#打开文件
open('filename.txt',encoding='utf-8')

with open() as file: # 无论写入是否有异常都会关闭文件
    pass

#关闭文件
file.close()#写入的内容在缓存区时,调用close才会保证把内容写入的数据存入磁盘

file.flush()#不想关闭文件,但是需要把缓冲区的内容写入文件

#读取文件内容
file.read(number,seek="")#读取前几个字符,seek改变起始位置

file.readline()#读取一行

file.readlines()#读取全部行,返回值一个字符串列表

3、目录的用法(主要是os模块)


# 获取操作系统类型:nt--Windows,posix--linux or Mac
os.name()

# 获取当前的工作目录
os.getcwd()

# 返回指定路径下的文件和目录信息
os.listdir(path)

#创建目录
os.mkdir(path)

# 创建多级目录
os.makedirs(path)

# 删除不为空的目录
os.rmtree()

#从下至上遍历目录,返回值-->元组:dirpath、dirnames、filenames--该方法只在windows和unix中有效
os.walk(path,topdown=False)

# 用于获取文件或目录的绝对路径
os.path.abspath(path)

# 判断文件或目录是否存在,存在返回True,否则False
os.path.exists(path)

# 拼接路径
os.path.join(path,name)

# 分离文件名和扩展名
os.path.splitext()

# 从一个目录中提取文件名
os.path.basename(path)

# 从一个路径中提取文件路径,不包括文件名
os.path.dirname(path)

# 判断是否为路径
os.path.isdir(path)


#获取文件最后一次修改时间
st_mtime()

# 格式化时间
time.strftime('%Y:%m:%d %H:%M:%S',time.localtime(longtime))

# 获取文件大小
sz_size()

# 文件大小转换--'B', 'KB', 'MB', 'GB', 'TB', 'PB'
def StrOfSize(size):
    # 递归实现,精确为最大单位值 + 小数点后三位
    def strofsize(integer, remainder, level):
        if integer >= 1024:
            remainder = integer % 1024
            integer //= 1024
            level += 1
            return strofsize(integer, remainder, level)
        else:
            return integer, remainder, level

    units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
    integer, remainder, level = strofsize(size, 0, 0)

    if level + 1 > len(units):
        level = -1
    return ('{}.{:>02d} {}'.format(integer, remainder, units[level]))

十一、Python操作数据库


# 获取连接对象
conn=pymysql.connect(
    host='localhost',
    user='username',
    password='password',
    db='dbname',
    charset='utf8',
    cursorclass=pymysql.cursors.DictCursor
)

# 连接对象的方法
close:关闭数据库连接
commit:提交事务
rollback:回滚事务
cursor:获取游标对象,操作数据库

# 游标对象

# 关闭当前游标
cursor.close()

# 调用存储过程
cursor.callproc(procnamer,可选参数) 

# 执行数据库操作,sql语句或数据库命令
cursor.execute('...=? and ...=?',('使用占位符','避免sql注入'))

# 用于批量操作(%s可以作为占位符)
cursor.executemany()

# 获取查询结果集中的下一条记录,返回元组类型
cursor.fetchone()

# 获取指定数量的数据,返回列表
cursor.fetchmany(size)

# 获取结果集中的所有记录
cursor.fetchall()

# 跳到下一个可用的结果集
cursor.nextset()

# 指定fetchmany获取的行数
arrysize()

#数据库常见操作步骤
连接数据库--获取游标--执行sql语句--关闭当前游标--关闭连接

1、使用MySQL

  1. 下载地址(选择大体积的包):MySQL官网

  2. MySQL五种安装方式:

  • Developer Default:安装MySQL服务器及开发所需工具:GUI工作台、访问操作数据的excel插件等
  • Server Only–推荐:只安装MySQL服务器,适用于部署MySQL服务器
  • Client Only:适用于已经存在MySQL服务器是进行开发的情况
  • Full:安装MySQL所有可用组件
  • Custom:自定义需要安装的组件
  1. 安装完成后,需要设置MySQL环境变量,如下:
  • 安装目录bin的路径添加到系统path
  • 创建MYSQL_HOME–添加mysql安装根目录
  • 在系统环境变量path下添加;%MYSQL_HOME%\bin

4.启动MYSQL服务

  • services.msc可以查看mysql的服务名
  • cmd启动mysql:

net start mysqlXX
mysql -u root -p

  1. 安装MYSQL图形化管理工具—Navicat Premium: 提取码:3sd1

6.Python使用mysql

  • pip install -U pymysql #安装MYSQL包
  • import pymysql #导入MYSQL包

2、使用SQLite3

  1. Python默认安装了sqlite3的数据库包,只需引用:import sqlite3

  2. sqlite3图形化管理工具—SQLyog提取码:zt13

  3. SQLyog证书码:姓 名(Name):ttrar 序 列 号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c

十二、SQL基础

常用–表的增删改查

1. 新增
INSERT INTO DB_name.table_name(column1, column2,...) VALUES (value1, value2, ...);

2. 删除
# 删除表
DROP TABLE table_name;

# 删除整个表结构,1=1用于拼凑sql,如sql是动态的,有可能需要加条件,这样当条件存在时是正常的,如果条件不存在,就会报错
DELETE FROM table_name; or DELETE FROM table_name; or Delete from table_name where 1=1; 

# 删除满足条件的数据
DELETE FROM table_name WHERE some_column1=some_value1 and some_column2=some_value2;

3. 修改
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;

4. 查询
# 查询满足条件的数据
SELECT * FROM table_name WHERE some_column1=some_value1 and some_column2=some_value2;
#多表查询
select t1.some_column1,t1.some_column2,t2.some_column1 
from table_name1  t1 INNER JOIN  table_name  t2  on t1.some_column1=t2.some_column1 and t2.some_column2=some_value2;

5. 存储过程
drop PROCEDURE if exists procedureName;
create PROCEDURE procedureName(in parameter1 VARCHAR(64),parameter2 bigint(20),...)
BEGIN
	# SQL语句
	DELETE from table_name where some_column1=parameter1;
    ...
end;

call procedureName(parameter1); # 调用存储过程
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值