Python语法糖

1、__init__和__new__的区别:

__init__方法发生在__new__方法之后,是初始化一个新实例,控制整个实例初始化过程;__new__方法属于控制新实例生成的过程,属于类级别的方法。

__new__方法需要有返回值,返回类的实例,它的作用可以修改父类的一些不可更改的参数。

2、简述with方法打开处理文件帮我我们做了什么?

open方法没有做异常判断,需要写try,except以及finally;而with方法帮我们实现了这些。

3、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]

l = [1, 2, 3, 4, 5]
def f(x):
    return x**2
res = map(f, l)
res = [i for i in res if i > 10]

4、python中生成随机整数、随机小数、0--1之间小数方法

随机整数:random.randint(a, b)

随机小数:np.random.randn(5)

0-1之间小数:random.random()

5、避免转义给字符串加哪个字母表示原始字符串?

字符串前面加r表示普通字符串。

6、python中断言方法举例

直接用assert(expression)

7、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句

select distinct name from student

8、10个Linux常用命令

ls cp pwd cp rm mkdir mv touch echo grep cat

9、pyhon2 和 python3区别?

(1)print 函数,python2可以带小括号,也可以不用;python3需要带小括号

(2)python2 range(1, 10)返回列表,python3返回迭代器

(3)python2使用ascii编码,python3使用utf-8编码

(4)python2中unicode表示字符串序列,str表示字节序列

python3中str表示字符串序列,byte表示字节序列

(5)python2为了正常显示中文,引入coding声明,python3中不需要

(6)python2中是raw_input()函数,python3是input()函数

10、python中is和==的区别:

python中元素包含三个要素,分别是id(身份标识)、type(数据类型)和value(值)。

“==”比较的是value的值

“is”比较的id的值

11、简述read、readline、readlines的区别:

read读取整个文本

readline读取下一行数据

readlines读取整个文件到迭代器以便我们遍历

12、举例说明创建字典的至少两种方法:

第一种方法:

dict1 = {key1:v1, key2:v2}

第二种方法:

dict2 = {}
dict2[key1] = v1

dict2[key2] = v2

第三种方法:

dict3 = {key1=v1, key2=v2}

13、*args,**kwargs的作用是什么?如何使用?

*args,**kwargs在函数的定义里,

*args可以传入不定量个数的非关键字参数用元组的形式,**kwargs可以传入不定量个数的关键字参数用字典的形式

14、python中match()和search()的区别? 

math是从字符串头开始匹配,search是从字符串中查找。

15、一个函数接收文件夹的名称作为参数,返回该文件中所有文件的全路径,请补全缺失的代码。

def print_directry_contents(spath):
    import os
    files_list = os.listdir(spath)
    for file in files_list:
        print(os.path.realpath(file))

16、阅读下面的代码,写出A0,A1至An的最终值:

A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
A0 = {'a':1,'b':2,'c':3,'d':4,'e':5}
A1 = range(10)
A1 = [0,1,2,3,4,5,6,7,8,9]
A2 = [i for i in A1 if i in A0]
A2 = [] # 当对字典进行in判断是,判断的是key
A3 = [A0[s] for s in A0]
A3 = [1,2,3,4,5]
A4 = [i for i in A1 if i in A3]
A4 = [1,2,3,4,5]

17、请写一段代码实现Python中list去重。

list1 = [1, 1, 2, 2, 3]
set1 = set(list1)
list1 = list(set1)
print list1

18、创建一个装饰器将下面函数输入的字符串首字母大写。

def decoration(func):
    def wrapper(*args, **kwargs):
        msg = func(*args, **kwargs)
        msg = msg.capitalize()
        return msg
    return wrapper

@decoration
def greetings(word="Hi There"):
    return word.lower()

if __name__ == '__main__':
    print(greetings(word='HELLO, WORLD! '))

19、描述yield作用。

yield在python中是生成器,不能直接调用,只能通过next()方法调用;每次返回一个迭代值,可以避免存list循环内存过大。

20、装饰器。

装饰器本质上python函数,它可以让其他函数在没有任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。

21、你对多线程和多进程的理解。

进程是指系统中正在运行的一个应用程序;专业的说它是程序执行的一个实例,既它是程序已经执行到各种程度的数据结构汇合;从内核的角度看,进程的目的就是担任分配资源(CPU时间、内存等)的基本单元。

进程的五个方面:

动态性:进程的实质是一次执行,进程是动态产生,动态消亡的。

并发性:任何进程都可以和其他进程一起并发。

独立性: 进程是一个能够独立运行的基本单位,同时也是系统分配资源和调度的独立单元。

异步性:由于系进程的相互制约,使进程具有执行的间断性。

结构特性:进程由程序、数据和进程控制三部分组成。

线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。

线程有四个特点:

1、线程有独立的堆栈段,共享地址空间,开销较小,切换速度较快。

2、线程间的通信机制比较方便。

3、线程数不大于CPU数时,不同线程可以运行在不同CPU上,使得CPU使用更加有效。

4、线程改善了程序结构,避免了一些嵌套循环。

使用线程的两点注意事项:

1、当多线程访问同一全局变量时,一定要加互斥量,也就是上锁,当然使用完后需要解锁。

2、线程的终止,线程资源不会释放,需要调用join()函数使其释放。

22、线程中start方法和run方法的区别? 

若调用start,则先执行主进程,后执行子进程; 

若调用run,相当于正常的函数调用,将按照程序的顺序执行;

23、linux命令 grep awk sed是怎么用的?

grep是查找

awk根据内容分析处理

sed编辑

24、python是怎么进行内存管理的?

(1)引用计数:Python内部记录有多少个对象就有多少个引用计数,当对象被创建时就创建时就创造一个引用计数,当对象不需要时,引用计数清0。

引用计数加1:1、对象被创建:x=4,2、另外的别人被创建:y=x,3、被作为参数传递给函数:foo(x),4、作为一个容器对象的一个元素:a=[1,x,'33']

引用计数减1:1、一个本地引用离开了它的作用域,2、对象的别名被销毁,3、对象的一个别名被赋值给其他的对象:x=789,4、对象从一个窗口中移除:myList.remove(x),5、窗口对象本身被销毁:del myList,或者窗口对象离开了它的作用域。

(2)垃圾回收:当内存中有不使用的部分,垃圾收集器也会把他们清理掉;它会去检查那些引用计数为0的对象,然后清除其在内存的空间;两个对象互相引用时,他们本身其他的引用也全部为0;清理掉循环引用的两个对象。

(3)内存池机制:Python中很多小块的内存,这些内存很快又会被释放,为了提高程序执行速度,Python引入了内存池机制。小于256个字节的对象用pymalloc实现分配,而大的对象使用系统的malloc。Python对象都有私有内存池,对象间不共享内存池,也就是分配或释放大量整数,用于缓存这些整数的内存就不能存浮点数。

25、什么是lambda函数?他有什么好处? 

lambda函数是匿名函数;使用lambda函数能够创建小型匿名函数。

f = lambda x,y: x + y

26、python中tuple和list的转换:

tuple ----> list:

tuple1 = (1, 2, 3)

list1 = list(tuple1)

list -----> tuple:

list1 = [1, 2, 3]

tuple1 = tuple(list1)

27、python中如何拷贝一个对象?

赋值(=):创建了对象的一个新的引用,修改其中任一个变量都会影响到另一个。

浅拷贝:创建一个新的对象,但它包含了原始对象中包含项的引用。

深拷贝:创建一个新的对象,并递归复制它所包含的对象。

28、介绍下except的用法和作用:

try:

pass

except Exception as e:

print(e)

finally:

pass

捕获try except中间发生异常的代码;如果发生异常执行except代码,不管是否异常都执行finally代码。

29、用python匹配HTML tag的时候,<.*>和<.*?>有什么区别?

<.*>是贪心匹配,返回所有匹配项;<.*?>是非贪心匹配,返回单一匹配项。

30、有没有一个工具可以帮助查找Python的bug和进行静态的代码分析?

pychecker 是一个python的静态代码分析工具,可以帮助查找python代码的bug,会对python代码的复杂度和格式提出警告。

pylink是另外一个python分析工具,

31、请写一段脚本,查找/data/test 目录下3天前的文件,从中挑选出大小超过10M的删除掉。

32、请写一段python代码,替换掉目标字符串中的[北京市,技术,有限,公司]等字符,比如:目标字符串:北京市麦达技术数字有限公司,要求替换输出 麦达数字。 

str1 = "北京市麦达技术数字有限公司"
str2 = str1.replace("北京市","").replace("技术","").replace("有限","").replace("公司","")

33、有三张表分别存放省市(province),地市(city)和县区(area)的名称和编码,表名如下表格:

34、有一个纯字符串,编写一段代码,列出其所有字符的大小写组合:

def word_group(word):
    word = word.lower()
    list1 = []
    list2 = []
    for letter in word:
        if not list1:
            list1.append(letter)
            list1.append(letter.upper())
        else:
            list2 = copy.deepcopy(list1)
            for i in range(len(list1)):
                list1[i] = list1[i] + letter
                list2.append(list2[i] + letter.upper())
                list2[i] = list2[i] + letter

    return list2

26、简述一下你熟悉的NOSQL,它有什么优点和缺点?

27、使用一个正则表达式设计一个程序,将字符串"正则表达式题库"的www.baidu.com和www.cdtest.cn同时匹配出来。

import re
str = "\<a href=www.baidu.com\>正则表达式题库\</a>\<a href=www.cdtest.cn\>\</a>"
regex = r"href=(.*?)>"
ret_list = re.findall(regex, str)
print ret_list

28、设计一个程序,求出1+3!+5!+7!+9!+50!的和。

m = 0
for i in range(1, 6):
    n = 1
    for j in range(1, 2 * i):
        n = n * j
    m += n
l = 1
for k in range(1, 51):
    l = l * k
m += l
print(m)

29、把字符串“HELLO PYTHON”从大写字母全部转换成小写字母并换行显示,然后输出到计算机c盘的hello.txt文件中保存。

str = 'HELLO PYTHON'
with open('c:/hello.txt', 'a') as f:
    for letter in str:
        f.write(letter.lower())
        f.write('\n')

30、设计一个小程序,采用任意数据结构方法,输入年、月、日后能判定当前日期在本年是第几天。

def judge_dayth(y=None,m=None,d=None):
    if y % 4 == 0 and y % 100 != 0 or y % 400 == 0:
        m_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    else:
        m_list = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if m == 1:
        return d
    else:
        m_days = 0
        for i in range(m - 1):
            m_days += m_list[i]
        return m_days + d

31、给定一个值为整数的数组int_array,找出int_array中第二大的整数。

sorted_nums = sorted(nums)
print sorted_nums[-2]

32、使用python将字符串“1.2.3.4.5”转换为字符串“5|4|3|2|1”。

str = "1.2.3.4.5"
li = str.split(".")
li = sorted(li, reverse=True)
str = "|".join(li)

33、请分别描述python2.x和python3.x中import包时的路径搜索顺序。

(1)、当前目录

(2)、PYTHONPATH下的每个目录

(3)、如果都找不到,Python会查看默认路径。

34、用Python的正则表达式匹配时间信息。

import re
data_info = "现在的时间是:2018-3-10 11:52"
regex = r"\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{2}"
ret = re.search(regex, data_info).group()

35、使用python编写一个装饰器,打印被装饰函数的输入与输出。

from functools import wraps
def print_io(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("函数的输入:{}".format(*args, **kwargs))
        ret = func(*args, **kwargs)
        print("函数的输出:{}".format(ret))
        return ret
    return inner

36、阐述range和xrange的区别,并且用Python仿写xrange函数。

range()生成一个数组,xrange()生成一个迭代器。

def xrange(*args,**kwargs):
    for i in range(*args, **kwargs):
        yield i

37、列举几种你曾经常用的python包并且解释其功能及用法:

os模块:os模块包含了函数不同操作系统的通用接口,获得路径

sys:给命令行传参

re:正则匹配

38、合并列表a=[1,2,3,4]和b=[5,6,7,8] :

a.extend(b)

39、列表a,请写出实现正序排列,倒序排列,逆序排列的内置方法。

a.sort()

a.sort(reverse=True)

a.reverse()

40、字典d={"k":1,"v":2},请写出d.items()的结果。

[('k', 1), ('v', 2)]

41、复杂列表[{"k":1,"v":2},{"k":12,"v":22},{"k":13,"v":32}],请用内置方法写出k的倒序排列的代码。

li = [{"k":1,"v":2},{"k":12,"v":22},{"k":13,"v":32}]
li.sort(key=lambda dict:dict["k"], reverse=True)

42、集合s = set([1,2,3,4]),d = set([2,4,9,0,3]),请用内置方法写出它们的并集,交集,对称公差。 

交集s|d、并集s&d、对称公差s^d

43、请随机输出一个大于0小于1的数;请随机输出一个100以内的整数。 

random.random()

random.randint(1,100)

44、长度未知的元组a=(1,3,4,5,6,...),请随机输出n项 。

import random a=(1,3,4,5,6,...)

a = list(a)

for i in range(n):

b = a[random.randint(0, len(a)) - 1]

a.remove(b)

45、代码a=[{i:j} for i,j in enumerate(range(5))],请写出a的最终结果。 

enumerate返回index和对应的值。

46、分别说说cmp,map,filter的作用?

cmp就是compare比较两数大小。

map表示映射,(function, iterable)将function作用与iterable,返回一个list。

filter结构和map类似(function, iterable)将function作用于iterable每个元素,如果返回True,则保留该元素;如果返回False,则删除该元素。

47、写一段代码实现单例模式。

48、用yield写出一个生成器。

for i in range(5):

yield i

49、说明os、sys模块不同,并列举常用的模块方法。 

os: 提供一种方便的使用操作系统的函数。

sys:提供访问解释器使用或维护的变量和在解释器交互使用的函数。

50、@classmethod、@staticmethod、@property都是啥意思? 

@classmethod:类方法,需要把类本身当作参数当作该方法的第一个参数,python内置了函数把类中的函数定义成类方法。

@staticmethod:静态方法

@property:属性方法,一般将实例方法提升为有setter功能的方法

51、请解释一下Gevent和threading/multiprocessing的关系。 

分别是协程、线程和多进程。

进程是具有一定独立功能的程序关于某个数据集合上的运行活动,进程是系统分配资源和独立调度的一个独立单元。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比线程更小的独立运行的基本单位。

协程是一种用户态的轻量级线程,协程的调度完全由用户控制;协程拥有自己的寄存器上下文和栈,协程切换时把寄存器上下文和栈保存在其他地方,切回来的时候恢复以前的保存的寄存器上下文和栈,直接操作栈则没有任何内核切换的开销,可以不加锁的访问全局变量,所以上下文切换速度非常快。

52、请解释一下cookie和session的关系,以及csrf的攻击和防范方法。

53、描述对super,pass,yield,lambda关键字修饰的理解。

super调用父类的一个方法

pass是一个占位符,用于保证格式和语义的完整性

yield 生成器,yield后面表达式可以通过next()方法返回

lambda是定义的匿名函数

54、进程间通讯的五种方式:

管道:速度慢、容量有限、只有父子进程能通讯;

FIFO:任何进程间都能通讯,但速度慢;

消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;

信号量:不能传递复杂数据,只能用来同步;

共享内存区:  能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值