欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

回顾

程序员文章站 2022-05-23 10:54:24
...

回顾

可迭代对象、迭代器和生成器

  • 可迭代对象
1、定义 :可通过for循环迭代读取数据供我们使用的对象
2、本质 :可迭代对象通过__iter__()方法向我们提供一个迭代器
3、示例
name_list = ['紫衫龙王','金毛狮王','白眉鹰王','青翼蝠王']
name_iterator = name_list.__iter__() # 提供该可迭代对象(names_list)的迭代器
for name in name_iterator:
    print(name)
    
4、__iter__()函数与__next()__函数的作用是什么?
  1、__iter()__函数: 获取可迭代对象的迭代器
  2、__next()__函数:对迭代器不断使用__next()__函数来获取下一条数据,完成之后再次调用会抛出StopIteration异常
  • 迭代器
一个实现了__iter__()方法和__next__()方法的对象,就是迭代器
  • 生成器
1、函数中有yield关键字,就称为生成器
2yield作用
  1、保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
  2、将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
3、如何启动生成器
  next():单纯的获取生成器中的一个值
4、示例
def f1():
    for i in range(3):
        yield i
g = f1()
print(next(g))

并发和并行

# 1. 并发
同时处理多个任务,内核在任务间不断地切换,达到好像多个任务同时被执行的效果,实际上每一时刻只有1个任务在占有CPU

# 2. 并行
一起执行,多个任务利用计算机的多核资源同时执行,此时多个任务之间是并行关系

# 3. 示例
在计算机系统中,并行和并发是同时存在的
计算机 :2核
任务   :QQ、微信、爱奇艺、英雄联盟、Chrome
并发   :这5个任务间存在着并发关系
并行   :第1(QQ)、第2(微信)

进程、线程、协程

# 1. 进程
程序的运行过程,是CPU分配资源的最小单位

# 2. 线程
最小执行单位,是系统分配内核的最小单位,由所属进程管理,一个进程可有多个线程

# 3. 协程
1、定义 :微线程,协程允许在不同的位置暂停或者开始执行,简单来说,协程就是可以暂停执行的函数
2、原理 :记录一个函数栈的上下文,进行协程的切换调度,当一个函数暂停执行时,会将上下文栈帧保存起来
3、本质 :单线程,资源消耗小,无须线程间切换的开销,无需加互斥锁
4、协程模块 :greenlet、gevent、... ...

基于协程的多任务并发?



Python中的那些锁

  • GIL锁

    # 1. GIL是什么? - CPython
    全局解释器锁,限制多线程同时执行,保证同一时间内只有一个线程在执行
    
    # 2. 作用
    同一进程中线程是数据共享,当各个线程访问数据资源时会出现竞争状态,即数据可能会同时被多个线程占用,造成数据混乱,这就是线程的不安全。而解决多线程之间数据完整性和状态同步最简单的方式就是加锁。GIL能限制多线程同时执行,保证同一时间内只有一个线程在执行
    
    # 3. 影响
    影响多线程效率
    
    # 4. 如何避免?
    1、用多进程 代替 多线程
    2、更换解释器
    
  • 互斥锁

    # 1. 问题原因
    多个线程共享数据时,如果数据不进行保护,则可能出现数据不一致现象
    # 2. 解决方案
    使用一把锁把代码保护起来,以牺牲性能换取代码的安全性
    # 3. 示例
    
  • 死锁

    多个进程/线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都无法进行下去,此时称系统处于死锁状态
    

产生死锁


避免死锁


MySQL数据库

  • 数据库的三范式

    # 1. 三范式
      1NF:字段不可分
      2NF:有主键,非主键字段依赖主键
      3NF:非主键字段不能相互依赖
    
    # 2. 解释 
      1NF:原子性 字段不可再分,否则就不是关系数据库
      2NF:唯一性 一个表只说明一个事物
      3NF:每列都与主键有直接关系,不存在传递依赖
        
    # 3. 解释
    1NF:
      符合1NF:   用户ID  用户名  密码   姓名  电话
      不符合1NF:用户ID  用户名  密码   用户信息(包含姓名和电话)
    
    2NF:
      第二范式是在第一范式的基础之上建立起来的,满足第二范式前提必须满足第一范式,要求数据库表中的每个实例或行都能被唯一区分,建立主键
    
    3NF:
      1、满足第三范式必须先满足第二范式
      2、要求:属性不依赖于其他非主属性,简而言之为如果表的信息能被推导出来,就不能单独设计一个字段来存放
      3、如果一个实体中出现其他实体的非主属性,可以将这两个实体用外键关联,而不是将另一张表的非主属性直接写在当前表中
      
    表1:
    商品名称  价格  描述   有效期    分类     分类描述
    雪碧       32020   酒水饮料   碳酸饮料
    
    重新设计后:1:商品信息表(product)2:分类信息表(product_type)
    商品ID 商品名称 价格 描述 有效期       分类ID  分类     分类描述
      1     雪碧    32020           1   酒水饮料  碳酸饮料
     
    表3:中间表(product_type) - 做外键关联
    商品ID  分类ID
      1       1
    
  • 关联查询

    1、内连接(inner join)
    2、左外连接(left join):以左表为主显示查询结果
    3、右外连接(right join):以右表为主显示查询结果
    select xxx from1 inner|left|right join from2 on 条件;
    4、问题: 查询商品的名称(name)、价格(price)以及所属分类(type)???
    
  • 子查询

    把外层命令的查询结果作为内层查询的查询条件,就是一条查询语句中又嵌套了查询语句
    
  • 索引的优缺点及建立原则

    # 1. 优点
    1、提高检索速度
    2、唯一性索引可保证数据库表中每一行数据的唯一性
    3、使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
    
    # 2.缺点
    1、创建索引和维护索引需要耗费时间;
    2、索引需要占用物理空间
    3、当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度
    
    # 3. 建立原则
    1、频繁用来查询的字段上建立索引
    2、需要排序的字段上建立索引
    3、频繁使用条件判断的字段建立索引
    
  • 常用存储引擎及特点

    1、InnoDB
    2、MyISAM
    3、MEMORY
    
  • MySQL数据库的优化

    1、存储引擎优化
    2、索引优化
    3、SQL语句优化
    
  • MySQL锁

    1、锁类型分类: 读锁、写锁
    2、锁粒度分类: 表级锁、行级锁
    
  • MySQL数据库重置密码

1、sudo -i
2/etc/init.d/mysql stop
3、cd /etc/mysql/mysql.conf.d
4、vi mysqld.cnf  在 [mysqld]下添加如下语句后保存退出
   skip-grant-tables
5/etc/init.d/mysql start
6、命令行:mysql
7、切换库:use mysql
8、重置密码:
    update user set authentication_string=password('新密码') where user='root';
9、去掉配置文件中刚添加的 skip-grant-tables
10、重启mysql服务登录 /etc/init.d/mysql restart

基础面试题

  • Python2和Python3的区别

    # 1、编码格式区别
    python2: 默认编码格式是ascii,如果代码中使用中文需加如下声明:
    #!coding=utf-8 或者 #!-*- coding=utf-8 -*-
    python3: 默认编码为utf-8,并且引入了字节串
      
    # 2、函数区别
    1print
       python2中是关键字,print "hello world"
       python3中是函数,print()
    2input
       python2中有input()raw_input()
       python3中只有input()
    3range
       python2中range得到列表,xrange得到迭代器
       python3中只有range,得到迭代器
        
    # 3、运算修改
    python2中: 3/2=1  3.0/2=1.5
    python3中: 3/2=1.5 3.0/2=1.5
      
    # 4、数据类型
    python3中引入字节串,python3废弃python2的long类型,只有int
    
    # 5、语法变化
    1、异常: python2中异常和异常对象用逗号隔开
       except Exception,e
    2、python3中更加严格的缩进规则,在python2中tab和对应数量空格等同,python3中则不可以
    
  • 深拷贝和浅拷贝

    # 1、浅拷贝定义及特点
    1、定义: 对另外一个变量的内存地址引用的拷贝,这两个变量指向同一个内存地址的变量值
    2、特点: 
      公用一个值
      这两个变量的内存地址一样
      对其中一个变量值改变,另一个变量的值也会改变
    # 2、深拷贝定义及特点
    1、定义: 一个变量对另外一个变量的值拷贝
    2、特点:
      两个变量的内存地址不同
      两个变量各有自己的值,且互不影响 
      对其任意一个变量的值的改变不会影响另外一个
      
    # 3、python中如何实现?
    浅拷贝: copy.copy()
    深拷贝: copy.deepcopy()
      
    # 简单总结
    1、拷贝使用Python标准库模块 copy 实现
    2、copy.copy()内部拷贝了可变类型当时的引用,而copy.deepcopy()所有元素都拷贝
    
相关标签: 回顾