Python面试题练习
1、实现1--100之和
#解答一
print sum(xrange(101)) #解答二
s=0
for i in xrange(101):
s = s + i
print s
2、如何在一个函数内部修改全局变量
#coding=utf-8
name = "ryan" #全局变量
def fun():
country = "China" #局部变量
print name
global name #声明全局变量
name = "joe" #修改全局变量
print name
fun()
print name
3、谈下GIL
GIL是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大。
4、实现列表去重的方法
#coding=utf-8
#解答一:使用Set集合
a = [1,2,3,3,4,4,4]
a = list(set(a)) #解答二
a = [1,2,3,3,4,4,4]
b=[]
for i in a:
if i not in b:
b.append(i)
a=b #解答三
a = [1,2,3,3,4,4,4]
c={}
for i in a:
if a.count(i) > 1:
c.update({a.count(i):i})
for i in c:
for j in xrange(i-1):
a.remove(c[i])
5、fun(*args,**kwargs)中的*args,**kwargs什么意思?
#*args是用来发送一个非键值对的可变数量的参数列表给一个函数
#**kwargs是用来发送一个不定长度的键值对的参数给一个函数
6、python2和python3的range(100)的区别
#python2返回列表,python3返回迭代器,节约内存
7、一句话解释什么样的语言能够用装饰器?
#函数可以作为参数传递的语言,可以使用装饰器
8、简述面向对象中__new__和__init__区别
9、简述with方法打开处理文件帮我我们做了什么?
10、if __name__ == '__main__' 如何正确理解?
#coding=utf-8
'''
对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口。
而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。
一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。
''' #举一个例子来说明一下,假设我们有一个 const.py 文件,内容如下:
PI = 3.14
def main():
print "PI:", PI
main() '''
我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:
PI: 3.14
''' '''
现在,我们有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 const.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 area.py 中:
''' from const import PI
def calc_round_area(radius):
return PI * (radius ** 2)
def main():
print "round area: ", calc_round_area(2)
main() '''
运行 area.py,输出结果:
PI: 3.14
round area: 12.56
可以看到,const 中的 main 函数也被运行了,实际上我们是不希望它被运行,提供 main 也只是为了对常量定义进行下测试。这时,if __name__ == '__main__' 就派上了用场。把 const.py 改一下:
''' PI = 3.14
def main():
print "PI:", PI
if __name__ == "__main__":
main() '''
然后再运行 area.py,输出如下:
round area: 12.56
再运行下 const.py,输出如下:
PI: 3.14
这才是我们想要的效果。
if __name__ == '__main__' 就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。
'''
#https://www.cnblogs.com/yaohong/p/8660209.html
11、深浅拷贝的区别
#Python的数据结构总体分为两类:
#1、字符串和数字
#2、列表、元组、字典等 一、字符串和数字
对于字符串和数字而言,赋值(=)、浅拷贝(copy)和深拷贝(deepcopy)其实都没有意义,因为它们都永远指向同一个内存地址。
>>> import copy
>>> a1 = 100
>>> id(a1)
1426656816 # a1的内存地址 # 赋值
>>> a2 = a1
>>> id(a2)
1426656816 # 浅拷贝
>>> a3 = copy.copy(a1)
>>> id(a3)
1426656816 # 深拷贝
>>> a4 = copy.deepcopy(a1)
>>> id(a4)
1426656816 二、列表、元组、字典等
对于列表、字典而言,进行赋值(=)、浅拷贝(copy)和深拷贝(deepcopy),其引起的变化是不一样的。
2.1、赋值(=)
names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = names
names[1] = "Pear"
print(names)
print(name2)
print("-----------------")
names[3][1] = "Dog"
print(names)
print(name2)
print(id(names))
print(id(name2)) # 输出
['Angle', 'Pear', 'Athena', ['Banana', 'apple']]
['Angle', 'Pear', 'Athena', ['Banana', 'apple']]
-----------------
['Angle', 'Pear', 'Athena', ['Banana', 'Dog']]
['Angle', 'Pear', 'Athena', ['Banana', 'Dog']]
1504387406536
1504387406536 # 可以看到names 的每一次变化,name2也会改变,因为他们的内存地址是一样的
#这和字符串和数字是不一样的,当我们定义 a =1 ,b = a ,改变a时,b是不会有变化的。列表和字典等会跟着变化,因为他们的内存地址是一样的。
a = 1
b = a
a = 100
print(a)
print(b) # 输出 100
1 2.2、浅拷贝(copy)
import copy names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = copy.copy(names)
names[1] = "宙斯"
print(names, "names的内存地址是{}".format(id(names)))
print(name2, "name2的内存地址是{}".format(id(name2))) #输出
['Angle', '宙斯', 'Athena', ['Banana', 'apple']] names的内存地址是1764417452744
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] name2的内存地址是1764416035080 我们浅copy了一个name2,同时我们将names中的Zous的值改为中文,但是name2的没有改变。因为他们的内存地址是不一样的,改变其中一个不影响另外一个。
我们接下来看:
import copy names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = copy.copy(names)
names[1] = "宙斯"
print(names, "names的内存地址是{}".format(id(names)))
print(name2, "name2的内存地址是{}".format(id(name2))) names[3][1] = '苹果'
print(names, id(names[3]))
print(name2, id(name2[3])) # 输出
['Angle', '宙斯', 'Athena', ['Banana', 'apple']] names的内存地址是2306153560776
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] name2的内存地址是2306152155528
['Angle', '宙斯', 'Athena', ['Banana', '苹果']] 2306153648968
['Angle', 'Zous', 'Athena', ['Banana', '苹果']] 2306153648968 # 这次我们不仅改变了最外层的列表的值,还改变了列表中一个列表的值。
# 这次的结果是 里层的列表跟着做了改变
我们通过打印的内存地址可以明显看出,整个外层列表的内存地址是不一样的,但是里层的列表内存地址是一致的。
总结:浅拷贝(copy.copy(x))只是将列表等数据类型的第一层copy了一下,内存地址改变了。但是对于里层的数据类型的内存地址没有改变。 2.3、深拷贝(deepcopy)
深拷贝(copy.deepcopy(x))其实就是重新开辟了一个新的内存地址,存储deepcopy后的数据,和原来数据的内存地址完全不一样了,包括里层数据类型的内存地址。
import copy names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = copy.deepcopy(names)
names[1] = "宙斯"
print(names, "names的内存地址是{}".format(id(names)))
print(name2, "name2的内存地址是{}".format(id(name2))) names[3][1] = '苹果'
print(names, id(names[3]))
print(name2, id(name2[3])) #输出
['Angle', '宙斯', 'Athena', ['Banana', 'apple']] names的内存地址是2379824216776
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] name2的内存地址是2379824217160
['Angle', '宙斯', 'Athena', ['Banana', '苹果']] 2379824304968
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] 2379824305032 #可以看出,names不论是改变外层还是里层列表的数据,都不会影响到name2。
链接: https://www.cnblogs.com/bigberg/p/7246756.html
Python面试题练习的更多相关文章
- Python面试题 —— 获取列表中位数
中位数是一个可将数值集合划分为相等的上下两部分的一个数值.如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数:如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的中位 ...
- python公司面试题集锦 python面试题大全
问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...
- 【Python】【面试必看】Python笔试题
前言 现在面试测试岗位,一般会要求熟悉一门语言(python/java),为了考验求职者的基本功,一般会出 2 个笔试题,这些题目一般不难,主要考察基本功.要是给你一台电脑,在编辑器里面边写边调试,没 ...
- Python面试题整理-更新中
几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...
- python 面试题4
Python面试题 基础篇 分类: Python2014-08-08 13:15 2071人阅读 评论(0) 收藏 举报 最近,整理了一些python常见的面试题目,语言是一种工具,但是多角度的了解工 ...
- 一道Python面试题
无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun(): temp = [lambda x : i*x for i in range(4)] return ...
- 很全的 Python 面试题
很全的 Python 面试题 Python语言特性 1 Python的函数参数传递 看两个例子: Python 1 2 3 4 5 a = 1 def fun(a): ...
- SQL + Python 面试题:之二(难度:中等)
SQL + Python 面试题:之二(难度:中等)
- Python面试题之一:解密
Python面试题之一: 说明:就是Python工程师面试题 一.字典转换与正则提取值 1:key与Value交换 a = {'a':1,'b':2} print({value:key for key ...
- 震惊!几道Python 理论面试题,Python面试题No18
本面试题题库,由公号:非本科程序员 整理发布 第1题: 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候 ...
随机推荐
- Python实现将爱词霸每日一句定时推送至微信
前言 前几天在网上看到一篇文章<教你用微信每天给女票说晚安>,感觉很神奇的样子,随后研究了一下,构思的确是巧妙.好,那就开始动工吧!服务器有了,Python环境有了,IDE打开了...然而 ...
- 在vue2.0中引用element-ui组件库
element-ui是由饿了么团队开发的一套基于 Vue 2.0 的桌面端组件库. 官网:http://element.eleme.io/ 安装 npm i element-ui -S 引用完整的el ...
- vue内置组件 transition 和 keep-alive 使用
1.transition name - string,用于自动生成 CSS 过渡类名.例如:name: 'fade' 将自动拓展为.fade-enter,.fade-enter-active等.默认类 ...
- Python做windows服务
Python做windows服务(多进程服务),并结束多进程 Python中_,__,__xx__的区别 在注册MyWinService服务时,再使用 "sc delete 服务器名称&qu ...
- c++入门之const初步理解
关于const,首先建立这样的一个认识:const并不是定义了一个常量,而是定义了在某种环境下只读的变量.下面我们来区分一些东西: ; const int*p = # *p = ; i ...
- 关于always块内for循环的执行方式
//该模块主要用来说明for结构在时序逻辑中的执行方式 :] eq_dly ); integer i; 'b1; always @(posedge clk_1 or negedge nrst) beg ...
- [2019BUAA软工助教]第一次阅读 - 小结
[2019BUAA软工助教]第一次阅读 - 小结 一.评分规则 总分 16 分,附加 2 分,共 18 分 markdown格式统一且正确 - 2分 不统一:扣 1 分 不正确:扣 1 分(例如使用代 ...
- python中变量、函数、类名、模块名等命名方式
摘要:模块名:小写字母,单词之间用_分割ad_stats.py包名:和模块名一样类名:单词首字母大写AdStatsConfigUtil全局变量名(类变量,在java中相当于static变量):大写字母 ...
- iOS开发造轮子 | 通用占位图
https://www.jianshu.com/p/beca3ac24031 实际运用场景: 没网时的提示view,tableView或collectionView没内容时的展示view,以及其它特殊 ...
- Ubuntu16系统中安装htpasswd
htpasswd是Apache附带的程序, htpasswd生成包含用户名和密码的文本文件, 每行内容格式为“用户名:密码”, 用于用户文件的基本身份认证. 当用户浏览某些网页的时候, 浏览器会提示输 ...