Python(黄金时代)—— python深入使用

Posted 程序猿知秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python(黄金时代)—— python深入使用相关的知识,希望对你有一定的参考价值。

深拷贝和浅拷贝

可变类型与不可变类型

  • 可变对象是指,一个对象在不改变其引用的前提下,可以修改其所指向的地址中的值

  • 不可变对象是指,一个对象引用指向的值是不能修改的

浅拷贝

  • 浅拷贝是对于一个对象的顶层拷贝;

  • 简单理解就是,拷贝了引用,并没有拷贝内容

  • 这也就意味着,只要修改其中一个引用的内容,其它引用的地方也都会改变

深拷贝

  • 会拷贝引用指定的值,放入新生成的内存空间中

  • 引用也会重新生成

示例

import copy

# 浅拷贝
a=[1,3]
b=a
a.append(4)

# 引用地址一样,操作其中一个引用添加数据,另一个也会变
print("浅拷贝..............")
print(id(a))
print(id(b))
print(a)
print(b)

# 深拷贝
c=[1,3]
d=copy.deepcopy(c)
c.append(4)

# 引用不一样了,利用其中一个修改了值,另一个不会改变
print("深拷贝..............")
print(id(c))
print(id(d))
print(c)
print(d)

输出结果

总结:不管是浅拷贝还是深拷贝都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别

私有化、import、面向对象 

方法私有化

  • xx:公有变量

  • _x: 单前置下划线,私有化属性或方法,类对象和子类可以访问,但禁止导入

  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问

  • __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__

  • xx_:单后置下划线,用于避免与Python关键词冲突

示例

class Test:
    # 初始化方法
    def __init__(self,name,age,sex):
        # 公有变量
        self.name=name
        # 私有化属性
        self._age=age
        # 外部无法直接访问
        self.__sex=sex

    def show(self):
        print(self.name)
        print(self._age)
        print(self.__sex)

test=Test("as",12,"男")
test.show()

import 导入模块

  • import 搜索路径

    • 从下面列出的目录里面依次查找要导入的模块文件

    • '' 表示当前路径

    • 列表中路径的先后顺序代表了 python 解释器在搜索模块时的先后顺序

  • 程序添加路径

    • sys.path.append() 在末尾添加路径

    • sys.path.insert() 在指定位置插入路径

类方法类型

方法包括:实例方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同

  • 实例方法:由对象调用,至少有一个self参数,执行实例方法时,自动将调用该方法的对象赋值给self

  • 类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类赋值给cls

  • 静态方法:由类直接调用,可以没有任何参数

  • property方法: 一种与实例方法相似的特殊方法,使用方法如下

    • 定义时,在实例方法上加 @property 注解,并只有 self一个参数

    • 调用时,无需括号

    • property 有三种访问方式,分别对应三个被 @property、@方法名.setter、@方法名.deleter 修饰的方法

示例

class Test:

    age =12

    def __init__(self,name):
        self.name=name

    def instance_method(self):
        """实例方法,至少有一个self参数"""
        print("这是实例方法,name值是:",self.name)

    @classmethod
    def class_method(cls,age):
        """类方法,至少有一个cls参数"""
        cls.age=age
        print("这是类方法,age值是:",cls.age)

    @staticmethod
    def static_method():
        """这是静态方法,可以没有任何参数"""
        print("这是静态方法")

    @property
    def count(self):
        """这是property特殊属性"""
        return 11
    @count.setter
    def count(self,value):
        print("property设置值为:",value)
    @count.deleter
    def count(self):
        print("property删除")

test=Test("张三")
#调用实例方法
test.instance_method()

#调用类方法
Test.class_method(22)

# 调用静态方法
Test.static_method()

# 调用property方法
aa=test.count
print(aa)
test.count=44
del test.count

输出结果

property的第二种用法

class Test2:

    def get_count(self):
        return 22

    def set_count(self,value):
        print("设置值:",value)

    def del_count(self):
        print("删除值")

    # property 方法有四个参数
    # 第一个参数是方法名,调用对象.属性 时执行方法
    # 第二个参数是方法名, 调用对象.属性 = XXX 时,执行方法
    # 第三个参数是方法名,调用 del 对象.属性 时,执行方法
    # 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
    cc=property(get_count,set_count,del_count,"ssssssss")

test2=Test2()
c=test2.cc
print(c)
test2.cc=444
del test2.cc
doc=test2.cc.__doc__
print(doc)

输出结果

魔法属性

__doc__  表示类的描述信息

class Tee:
    """ 描述类的信息 ,xxxxxxxxxxxxxxxxxxxxxx"""
    def __init__(self):
        pass

print(Tee.__doc__)

输出结果

__module__ 和 __class__

  • __module__ 表示当前操作的对象在哪个模块

  • __class__ 表示当前操作的对象类是什么

class Dog:
    def __init__(self,name):
        self.name=name

dog=Dog("小白")
print(dog.__module__)
print(dog.__class__)

输出结果

__init__

  • 初始化方法:通过类创建对象时,自动触发执行

class Dog:
    def __init__(self,name):
        self.name=name

dog=Dog("小白")

__del__

  • 当对象在内存中被释放时,自动触发执行

  • 此方法一般不用定义,程序员在使用时无需关心内存的分配和释放,Python解释器会自动执行,所以 __del__ 的调用是由解释器在进行垃圾回收时自动触发执行

class Dog:
    def __del__(self):
        pass

with与“上下文管理器”

# 普通版,此部分有一个潜在问题,即如果在write时发生异常,则close不会被调用,资源将得不到释放
def t1():
    f=open("aa.txt","w")
    f.write("hello world!")
    f.close()
    
# 升级版本, 此处可以保证发生异常时,资源能得到释放. 但是代码写得比较复杂
def t2():
    f = open("aa.txt", "w")
    try:
        f.write("hello world!")
    except Exception as e:
        print("发生错误!!")
    finally:
        f.close()

# 高级版,此处使用 with的作用和使用 try/finally 语句是一样的,并且写法更简洁
def t3():
    with open("aa.txt", "w") as f:
        f.write("hello world!")

什么是上下文

  • 上下文在不同的地方表示不同的含义,与文章的上下文含义一样。

上下文管理器

  • 任何实现了 __enter__ 和 __exit__ 方法的对象都可以称为上下文管理器,上下文管理器可以使用 with 关键字。文件(file) 对象也实现了上下文管理器

示例

# 自定义一个文件类,作为上下文管理器
class MyFile:
    def __init__(self,filename,mode):
        self.filename=filename
        self.mode=mode

    # 返回资源对象
    def __enter__(self):
        self.f=open(self.filename,self.mode)
        return self.f

    # 处理一些清除工作
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()


with MyFile("aa.txt","w") as f:
    f.write("sssssss")

程序猿与投资生活实录已改名为  程序猿知秋,WX同款,欢迎关注!

Python(黄金时代)——mysql数据库基础

数据库基本介绍

RDBMS(Relational Database Managerment System) :关系型数据库管理系统


关系型数据库的主要产品如下

  • mysql:web时代使用最广泛的关系型数据库

  • oracel:大型项目使用较多,如银行、电信等

  • ms sql server:普遍用于微软的项目

  • db2:IBM 的产品,主要用于大型项目

  • sqlite:轻量级数据库,主要应用于移动平台


SQL(Structured Query Language)

SQL是结构化查询语言,是一种用来操作 RDBMS的数据库语言,当前的关系型数据库都支持使用SQL语言进行操作

  • SQL语句主要分为

    • DQL:数据库查询语言,用于对数据进行查询

    • DML:数据库操作语言,用于对数据进行增加、修改、删除等操作

    • TPL:事务处理语言,对事务进行处理

    • DCL:数据库控制语言,进行授权与权限回收

    • DDL:数据库定义语言,进行数据库、表的管理

    • CCL:指针控制语言,通过控制指针完成对表的操作

    注:对于程序员来讲,最重要的就是对数据的curd(增、删、改、查),即DQL和DML


MySQL 简介

  • 直接查看MySQL官方网站(https://www.mysql.com/)

  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,之后又被Oracle收购,目前 属于Oracle旗下产品


MySQL的特点

  • 使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性

  • 支持多种操作系统,如Linux、Windows、MacOS... 等

  • 为多种编程语言提供了API,如C、C++、JAVA、Python ... 等

  • 支持多线程,充分利用 CPU资源

  • 多编码支持 GB2312、UTF-8 等

  • 支持多种存储引擎

  • MySQL 采用双授权政策,分为社区版和商业版,并且源码开源

  • 复制全局事务标识

  • 复制无崩溃从机

  • 复制多线程从机

  • ...


最主要的是 开源,免费、不要钱,并且使用范围广,跨平台支持性好,是学习数据库开发的首选


MySQL服务器与客户端的安装步骤较多,请自行百度(注,不同的操作系统,对应的mysql版本不一样)


Navicat

  • Navicat 是数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息

  • Navicat提供多达 7 种语言供客户选择,被公认为全球最受欢迎的数据库前端用户界面工具。

  • 它可以用来对本机或远程的 MySQL、SQL Server、SQLite、Oracle 及 PostgreSQL 数据库进行管理及开发


Navicat 的安装及基本使用,请自行百度


安装完成之后,可以自己创建数据库

数据库中表的数据类型与约束

  • 常用的数据类型

    • 整数:tinyint、int、bigint

    • 小数:decimal

    • 字符串:varchar、char

    • 日期时间:date、time、datetime

    • 枚举类型:enum

    • 类型说明

      • decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位

      • char表示固定长度的字符串,如char(3),如果填充 'ab' 时会补一个空格为 'ab '

      • varchar表示可变长度的字符串,如varchar(3),填充'ab'时,就只会存储'ab'

      • 字符串text表示存储大文本,当字符串大于4000时推荐使用

  • 约束

    • 主键索引primary key:物理上存储的顺序(默认是唯一索引)

    • 非空not null:此字段不允许填写空值

    • 唯一索引 unique:此字段的值不允许重复

    • 默认default:当不填写此值时会使用默认值,如果填写,则以填写为准

    • 外键foreign key:对关系字段进行约束,当为关系字符填写值时,会到关联的表中查询此值是否存在

    • 说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud时(增、删、改、查)时,都会降低数据库的性能,所以一般不推荐使用。在实际开发中,一般是通过业务逻辑控制数据的有效性


常用数据类型

类型
字节大小
有符号范围
无符号范围
TINYINT
1 -128~127 0~255
SMALLINT 2
-32768~32767
0~65535
MEDIUMINT
3
-8388608~8388607
0~16777215
INT/INTEGER
4
-2147483648~2147483647 0~4294967295
BIGINT
8
-9223372036854775808~9223372036854775807 0~18446744073709551615


字符串

类型
字节大小
示例
CHAR
0~255
char(3) ,输入'ab',存储为'ab',输入'abcd',存储为'abc'
VARCHAR
0~255
varchar(3),输'ab',存储为'ab',输入'abcd',存储为'abc
TEXT
0~65535
大文本


日期

类型
字节大小
示例
DATE
4
’2021-01-01‘
TIME
3
'23:59:59'
DATETIME
8
'2021-01-01 23:59:59'
YEAR
1
'2021'
TIMESTAMP
4
'1991-01-01 00:00:59' UTC - '2033-01-0100:00:59' UTC



数据库操作


通过命令行操作数据库


连接数据库

  • mysql -u用户名 -p密码 

Python(黄金时代)——mysql数据库基础


退出数据库连接

  • exit/quit/ctrl+c


查看所有数据库

  • show databases;

Python(黄金时代)——mysql数据库基础


显示时间

  • select now();


查看数据库版本

  • select version();


创建数据库并指定编码为utf8

  • create database python01 charset=utf8;

Python(黄金时代)——mysql数据库基础


删除数据库

  • drop database python01;


使用数据库

  • use python01;


查看当前使用的数据库

  • select database();

Python(黄金时代)——mysql数据库基础



数据表的操作


创建表

  • create table 表名字(字段 类型 约束)

  • 例:create table person(id int,name varchar(50));

Python(黄金时代)——mysql数据库基础


查看所有的表

  • show tables;


查看表结构

  • desc person;

Python(黄金时代)——mysql数据库基础


修改表-添加字段

  • alter table 表名 add 列名 类型;

  • 例:alter table person add age int;


修改表-修改字段

  • alter table 表名 change 原名 新名 类型及约束;

  • 例:alter table person change age sex int not null;


修改表-删除字段

  • alter table 表名 drop 列名;

  • 例:alter table person drop sex;


删除表

  • drop table 表名;

  • 例:drop table person;




数据表的基本增删改查(curd)

  • 添加数据两种方式

    • 方式一:insert into person(id,name) values(1,'zs');

    • 方式二:insert into person values(2,'ls');


  • 查询全部表数据

    • select * from person;

Python(黄金时代)——mysql数据库基础


  • 修改表数据

    • update person set name='ww' where id=2;

Python(黄金时代)——mysql数据库基础


  • 删除表数据

    • delete from person where id=2;

Python(黄金时代)——mysql数据库基础



数据表的查询

  • 使用as 给字段起别名

    • select name as 姓名,age from person;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 使用as 给表起别名 

    • select p.name ,p.age from person as p;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 去除重复的年龄 (DISTINCT )

    • SELECT DISTINCT age from person;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询大于30岁的人; 小于30岁的人; 不等于32岁的人;  (>,<,<>)

    • SELECT * from person where age>30;

    • SELECT * from person where age<30;

    • SELECT * from person where age<>32;


Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询年龄在 24到40之间的人 (> ,<)

    • SELECT * from person where age>24 and age<40;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询年龄是22或43的人 (or 或 in)

    • 方式一:SELECT * from person where age=22 or age=43;

    • 方式二:SELECT * from person where age in (22,43);

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询名字前面是李 开头的 ( like 'xxx%');查询后面是八 结尾的like '%xxx');查询名字中间有八的 like '%xxx%')

    • select *from person where name like '李%';

    • select *from person where name like '%八';

    • select *from person where name like '%八%';

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询年龄为null的人 (is null)

    • select *from person where age is null;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 询年龄不为null的人 ( is not null )

    • select *from person where age is not null;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 按年龄从大到小排序(order by xxx desc);按年龄从小到大排序  (order by xxx asc)

    • select *from person where age is not null order by age desc;

    • select *from person where age is not null order by age asc;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询所有人年龄的总和 ( sum )

    • select sum(age) as 年龄总和 from person;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础


  • 查询总共有多少人 (count)

    • select count(*) as 总人数 from person;


  • 查询最大的年龄 (max);查询最小的年龄 (min)

    • select max(age) as 最大年龄 from person;

    • select min(age) as 最小年龄 from person;



  • 按年龄分组统计人数 (group by)

    • select age,count(*) from person GROUP BY age;

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础



  • 按年龄分组统计人数,并统计相同年龄人数有2个的 (HAVING 

    • select age,count(*)total from person GROUP BY age HAVING total=2;

以上是关于Python(黄金时代)—— python深入使用的主要内容,如果未能解决你的问题,请参考以下文章

Python(黄金时代)——正则与简单web服务器

Python(黄金时代)——mysql数据库基础

Python(黄金时代)——mysql数据库基础

python之爬虫技术

深入python

深入了解Python--元组