python 交流

 

基础部分

1.看代码html

解释:python

字典是可变对象,在下方的 l.append(a)的操做中是把字典 a 的引用传到列表 l 中,当后续操做修改 a[‘num’]的值的时候,l 中的值也会跟着改变,至关于浅拷贝。

 2. 4G 内存怎么读取一个 5G 的数据?linux

方法一:
能够经过生成器,分屡次读取,每次读取数量相对少的数据(好比 500MB)进行处理,处理结束后在读取后面的 500MB 的数据。
方法二:
能够经过 linux 命令 split 切割成小文件,而后再对数据进行处理,此方法效率比较高。能够按照行数切割,能够按照文件大小切割。

 3.输入某年某月某日,判断这一天是这一年的第几天?redis

import datetime

def day_of_year():
    year = input("年份:")
    month = input("月份:")
    day = input("天:")
    date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    date2 = datetime.date(year=int(year),month=1,day=1)
    return (date1-date2).days + 1


print(day_of_year())

4. os.path 和 sys.path 分别表明什么算法

os.path 主要是用于对系统路径文件的操做。
sys.path 主要是对 Python 解释器的系统环境参数的操做(动态的改变 Python 解释器搜索路径)。

5.模块和包的区别数据库

python中,模块是搭建程序的一种方式,每个Python代码文件都是一个模块,并能够引用其余模块,好比对象和属性
一个包含许多 Python 代码的文件夹是一个包。一个包能够包含模块和子文件夹

 6.对字典d = {'a':24,'g':52,'i':12,'k':33}的values进行排序django

d = {'a':24,'g':52,'i':12,'k':33}

temp = sorted(d.items(),key=lambda x:x[1])
print(temp)


from operator import itemgetter
sorted_ed = sorted(d.items(), key=itemgetter(1))
print(sorted_ed)

 7.分析下列三个函数执行效率大小编程

利用程序分析包分析代码性能设计模式

import random
import cProfile

lIn = [random.random() for i in range(100**3)]  # 随机赋值,值越大越明显
cProfile.run('f1(lIn)')
cProfile.run('f2(lIn)')
cProfile.run('f3(lIn)')

利用装饰器分析执行性能浏览器

import time
def outter(func):
    def inner(*args):
        beign = time.time()
        func(*args)
        use_time = time.time()-beign
        print(use_time)
    return inner


@outter     # f1=outter(f1)(lIn)
def f1(lIn):
    l1 = sorted(lIn)
    l2 = [i for i in l1 if i<0.5]
    return [i*i for i in l2]

@outter
def f2(lIn):
    l1 = [i for i in lIn if i<0.5]
    l2 = sorted(l1)
    return [i*i for i in l2]

@outter
def f3(lIn):
    l1 = [i*i for i in lIn]
    l2 = sorted(l1)
    return [i for i in l2 if i<(0.5**0.5)]


import random
temp = [random.random() for i in range(100000)]

f1(temp)
f2(temp)
f3(temp)

 8.python内存管理机制

内存管理机制:引用计数,垃圾回收,内存池

应用计数制:python内部使用应用计数,来保持追踪内存中的对象,全部对象都有引用计数;

垃圾回收机制:当一个对象的引用计数为0的时候,它将会被垃圾回收机制处理;

内存池机制:python提供了对内存的垃圾收集机制,它将不用的内存放到内存池而不是返回给操做系统

垃圾回收机制:引用计数,标记清除,分代回收

 9.filter、map、reduce的做用?

1:Map:主要包括两个参数,函数和列表。 将函数的结果以列表的形式返回。

  会将一个函数映射到一个输入列表的全部元素。

  规范:map(lambda x: x * x,[y for y in range(3)])

  大多数时候,咱们要把列表中的全部元素一个个的传递给一个函数,并收集输出。

2:Filter:包括两个参数function,list。根据function的返回值是True, 来过滤list的参数中的项,最后返回结果。

  过滤列表中的元素,而且返回一个由全部符合要求的元素构成的列表。

  符合要求 即函数映射到该元素时返回值为True.

3: Reduce:从列表中取出头两个元素并传递到一个二元函数中去, 求出值,再添加到序列中继续循环下一个值,直到最后一个值。

  当须要对一个列表进行计算并返回结果时,reduce是一个颇有用的函数。

  例:当你须要计算一个整数列表的乘积时。一般在python中,你可能会使用基本的for循环来完成任务。

10.什么是可变,不可变类型?

  View Code

11. 1,2,3,4,5能够组成多少个互不相同且不重复的三位数?

使用python内置的排列组合函数itertools(不放回抽样排列)

product 笛卡尔积  (有放回抽样排列)

permutations 排列  (不放回抽样排列)

combinations 组合,没有重复  (不放回抽样组合)

combinations_with_replacement 组合,有重复  (有放回抽样组合)

import itertools

goal = list(itertools.permutations('12345',3))
print(goal)     # 返回全部结果

12.metaclass的做用:

 

设计模式相关

1.手写一个单例模式,或者经过装饰器实现一个单例模式

  单例模式连接

2.单例模式应用场景有哪些?

  资源共享的状况下,避免因为资源操做时致使的性能或损耗等。如日志文件,应用配置

   控制资源的状况下,方便资源之间的互相通讯。如线程池等

3.函数装饰器的做用?

  让其余函数在不须要作任何代码的变更的前提下增长额外的功能 

  如:插入日志、性能测试、事务处理、缓存、权限的校验等场景

 4.谈谈对面向对象的理解?

  面向对象是相对于面向过程而言的

  面向过程是一种基于功能分析的,以算法为中心的程序设计方法

  面向对象是一种基于结构,以数据为中心的程序设计思想

网络编程相关

1. 谈谈你对多进程,多线程,以及协程的理解,项目是否用?

  进程:一个运行的程序(代码)就是一个进程,进程是系统资源分配的最小单位。进程都拥有本身独立的内存空间,之间数据不共享,开销大

  线程:调度执行的最小单位,也叫执行路径,不能独立存在,一个进程至少有一个线程,叫主线程。多个线程之间共享内存(数据共享,全局变量共享),从而极大提升了程序的运行效率

  协程:用户态的轻量级线程,协程的调度彻底由用户控制。协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操做栈则基本没有内核切换的开销,能够不加锁的访问全局变量,因此上下文的切换很是快

2.什么是线程竞争? 

  线程是非独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎同步会被多个线程占用,形成数据混乱 ,即所谓的线程不安全那么解决多线程竞争利用了锁。

  锁的好处:确保某段共享数据资源只能由一个线程从头至尾完整执行

  锁的坏处:阻止了线程并发执行。包含锁定某段代码实际只能以单线程模式执行,效率下降

  锁的致命问题:死锁

3.死锁概念? 

  若干子线程在系统资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不肯先解锁,互相干等着,程序没法执行下去,这就是死锁。

4.GIL锁?

  GIL 锁:全局解释器锁(只在 cpython 里才有)

  做用:限制多线程同时执行,保证同一时间只有一个线程执行,因此 cpython 里的多线程实际上是伪多线程

5.进程和线程的使用场景?

  多进程适合在 CPU 密集型操做(cpu 操做指令比较多,如位数多的浮点运算)。

  多线程适合在 IO 密集型操做(读写数据操做较多的,好比爬虫)。

6.请简述浏览器是如何获取一枚网页的?

  1.在用户输入目的 URL 后,浏览器先向 DNS 服务器发起域名解析请求

  2.在获取了对应的 IP 后向服务器发送请求数据包

  3.服务器接收到请求数据后查询服务器上对应的页面,并将找到的页面代码回复给客户端

  4.客户端接收到页面源代码后,检查页面代码中引用的其余资源,并再次向服务器请求该资源

  5.在资源接收完成后,客户端浏览器按照页面代码将页面渲染输出显示在显示器上

7.cookie和session的区别?

  1.cookie 数据存放在客户的浏览器上,session 数据放在服务器上

  2.cookie 不是很安全,别人能够分析存放在本地的 cookie 并进行 cookie 欺骗考虑到安全应当使用session

  3.session 会在必定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用 cookie

  4.单个 cookie 保存的数据不能超过 4K,不少浏览器都限制一个站点最多保存 20 个 cookie

  5.将登录信息等重要信息存放为 SESSION 其余信息若是须要保留,能够放在 cookie 中

8.说说 HTTP 和 HTTPS 区别?

  HTTP 协议传输的数据都是未加密的,也就是明文的,所以使用 HTTP 协议传输隐私信息很是不安全,为了保证这些隐私数据能加密传输,因而网景公司设计了 SSL(Secure Sockets Layer)协议用于对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。简单来讲,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全。

  主要区别:

    1.https 协议须要到 ca 申请证书,通常免费证书较少,于是须要必定费用。

    2.http 是超文本传输协议,信息是明文传输,https 则是具备安全性的 ssl 加密传输协议。

    3.http 和 https 使用的是彻底不一样的链接方式,用的端口也不同,前者是 80,后者是 443。

    4.http 的链接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。

 代码优化

  1.优化算法时间复杂度

  2.减小冗余数据

  3.合理使用深浅拷贝

  4.使用dict和set查找元素

  5.合理使用生成器和yield

  6.循环的优化

  7.优化多个判断表达式的顺序

  8.使用join合并迭代器中的字符串

  9.使用合适的格式化字符串方式

  10.不借用中间变量交换连个两个变量的值

数据库相关

数据库优化方案:

  一、建立数据表时把固定长度的放在前面()

  二、将固定数据放入内存: 例如:choice字段 (django中有用到,数字一、二、3…… 对应相应内容)

  三、char 和 varchar 的区别(char可变, varchar不可变 )   

  四、联合索引遵循最左前缀(从最左侧开始检索)

  五、避免使用 select *

  六、读写分离     - 实现:两台服务器同步数据     

    - 利用数据库的主从分离:主,用于删除、修改、更新;从,用于查; 读写分离:利用数据库的主从进行分离:主,用于删除、修改更新;从,用于查

  七、分库     - 当数据库中的表太多,将某些表分到不一样的数据库,例如:1W张表时     

    - 代价:连表查询

  八、分表     

  - 水平分表:将某些列拆分到另一张表,例如:博客+博客详情     

  - 垂直分表:讲些历史信息分到另一张表中,例如:支付宝帐单

  九、加缓存    

   - 利用redis、memcache (经常使用数据放到缓存里,提升取数据速度)

   若是只想获取一条数据:

  - select * from tb where name=‘alex’ limit 1

相关文章
相关标签/搜索