博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python面试题练习
阅读量:5244 次
发布时间:2019-06-14

本文共 5552 字,大约阅读时间需要 18 分钟。

1、实现1--100之和

1 #解答一2 print sum(xrange(101))3 4 #解答二5 s=06 for i in xrange(101):7     s = s + i8 print s
View Code

2、如何在一个函数内部修改全局变量

#coding=utf-8name = "ryan"   #全局变量def fun():    country = "China" #局部变量    print name    global name     #声明全局变量    name = "joe"    #修改全局变量    print namefun() print name
View Code

3、谈下GIL

GIL是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大。
View Code

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])
View Code

 5、fun(*args,**kwargs)中的*args,**kwargs什么意思?

#*args是用来发送一个非键值对的可变数量的参数列表给一个函数#**kwargs是用来发送一个不定长度的键值对的参数给一个函数
View Code

6、python2和python3的range(100)的区别

#python2返回列表,python3返回迭代器,节约内存
View Code

7、一句话解释什么样的语言能够用装饰器?

#函数可以作为参数传递的语言,可以使用装饰器
View Code

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.14def main():    print "PI:", PImain()'''我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:PI: 3.14''''''现在,我们有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 const.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 area.py 中:'''from const import PIdef calc_round_area(radius):    return PI * (radius ** 2)def main():    print "round area: ", calc_round_area(2)main()'''运行 area.py,输出结果:PI: 3.14round area:  12.56可以看到,const 中的 main 函数也被运行了,实际上我们是不希望它被运行,提供 main 也只是为了对常量定义进行下测试。这时,if __name__ == '__main__' 就派上了用场。把 const.py 改一下:'''PI = 3.14def main():    print "PI:", PIif __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
View Code

 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 = namesnames[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']]15043874065361504387406536 # 可以看到names 的每一次变化,name2也会改变,因为他们的内存地址是一样的#这和字符串和数字是不一样的,当我们定义 a =1 ,b = a ,改变a时,b是不会有变化的。列表和字典等会跟着变化,因为他们的内存地址是一样的。  a = 1b = a a = 100print(a)print(b) # 输出 10012.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。
View Code

链接: https://www.cnblogs.com/bigberg/p/7246756.html

转载于:https://www.cnblogs.com/windyrainy/p/10658404.html

你可能感兴趣的文章
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
Android弹出框的学习
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>