面试基础02
1.
请编写一个函数实现将IP地址转换成一个整数。 如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 00001001 12 00001100 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ? def ipAddr_union(ip_addr): li = ip_addr.split('.') new_li = [] print(li) # ['10', '3', '9', '12'] for i in li: numStr = str(bin(int(i))) binStr = numStr.split('b')[1] # print(binStr) while len(binStr)< 8: binStr = '0'+binStr new_li.append(binStr) print(new_li) res_str = '' for i in new_li: res_str += i print(res_str) # 00001010000000110000100100001100 res_int = int(res_str, 2) print(res_int) # 167971084 ipAddr_union('10.3.9.12')
2.
import sys sys.getrecursionlimit() # 获取最大递归层数 默认是1000(0-999) sys.setrecursionlimit(2000) # 设置最大递归层数
3.
通过代码实现如下转换: 二进制转换成十进制:v = “0b1111011” 十进制转换成二进制:v = 18 八进制转换成十进制:v = “011” 十进制转换成八进制:v = 30 十六进制转换成十进制:v = “0x12” 十进制转换成十六进制:v = 87 ''' # hex()转16进制;oct()转8进制;bin()转二进制;int()转十进制 # 二进制转换成十进制 v = "0b1111011" print(int(v, 2)) # 123 # 十进制转换成二进制 v = 18 print(bin(v)) # 0b10010 # 八进制转换成十进制 v = "011" print(int(v, 8)) # 9 # 十进制转换成八进制: v =30 print(oct(v)) # 0o36 # 十六进制转换成十进制 v = "0x12" print(int(v, 16)) # 18 # 十进制转换成十六进制: v = 87 print(hex(v)) # 0x57 '''
4.
b 比特bit / 位 B——字节 1 B = 8b(8个bit/ 位)一个字节(byte)等于8位(bit) KB——千比特 1 kB = 1024 B (kB - kilobajt) MB——兆比特 1 MB = 1024 kB (MB - megabajt) GB——吉比特 1 GB = 1024 MB (GB - gigabajt)
5.
位:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1。 字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。
6.
CPython 官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。CPython是使用最广且被的Python解释器。 IPython IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。 CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。 PyPy PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。 绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。 Jython Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。 IronPython IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
7.
编译型(如C语言):编译型-------->GCC编译器-------->机器语言 特点:执行效率高 开发效率低 跨平台性差 其他(现在大多数语言都是编译型) 解释型(python语言)解释型-------->解释器(解释一行执行一行) 特点:执行效率低 开发效率高 跨平台性高 编译型语言: 使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。 特点: 在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件. 执行方式: 源代码 ———> 编译(一次编译) ———>目标代码———>执行(多次执行)———>输出 解释型语言: 使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。 特点: 解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。 执行方式: 源代码 ———> 解释器(每次执行都需要解释)———>输出 编译型: C c++, c# 解释型: python PHP ruby, java
8.
Python是一门优秀的综合语言, Python的宗旨是简明、优雅、强大,<br>在人工智能、云计算、金融分析、大数据开发、WEB开发、自动化运维、测试等方向应用广泛
9.
Python:轻量级、易学、自由/开放源码软件、可移植性、支持面向对象、丰富的库、规范的代码。 Java:优点:开源性,功能强大,库多 缺点:编译速度 比较慢,不完全 PHP:优点:性能很强,配合简单,稳定,容易部署。 缺点:函数命名不规范,驼峰法和下划线,传参位置不一。 C: 优点:能操纵底层,能细粒度优化性能。 缺点:1、是面向过程的,2、运行时类型检查不可用,3、不提供命名空间功能,4、构 造函数和析构函数不可用。 C#: 优点: 强大的.NET Framework托管代码集合类,较简单的语言特性。WEB应用程序 开发速度快。 缺点:底层和高性能不合适,Windows平台以外支持有限。 C++: 优点:性能比较高,可进化型。 缺点: 难学,门槛高
10.
''' 求结果: v1 = 1 or 3 v2 = 1 and 3 v3 = 0 and 2 and 1 v4 = 0 and 2 or 1 v5 = 0 and 2 or 1 or 4 v6 = 0 or False and 1 ''' >>>print(1 or 3) 1 >>>print(1 and 3) 3 >>>print(0 and 2 and 1) 0 >>>print(0 and 2 or 1) 1 >>>print(0 and 2 or 1 or 4) 1 >>>print(0 or False and 1) False
11.
机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。 通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。 用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。现在,除了计算机生产厂家的专业人员外,绝大多数的程序员已经不再去学习机器语言了。 机器语言是微处理器理解和使用的,用于控制它的操作二进制代码。8086到Pentium的机器语言指令长度可以从1字节到13字节。尽管机器语言好像是很复杂的,然而它是有规律的。存在着多至100000种机器语言的指令。这意味着不能把这些种类全部列出来。总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。 字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。 通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode。 字节码在运行时通过JVM(JAVA虚拟机)做一次转换生成机器指令,因此能够更好的跨平台运行。 总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
12.
Python2默认的字符编码是ASCII,默认的文件编码也是ASCII ; python3默认的字符编码是unicode,默认的文件编码是utf-8。 在python2里,将string处理为原生的bytes类型。 python3把字符串的编码改成了unicode, 还把str和bytes做了明确区分, str就是unicode格式的字符,bytes是单纯二进制。 print语句没有了,取而代之的是print()函数。 在python 2.x中/除法整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。 在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。 捕获异常的语法由 except exc, var 改为 except exc as var。 Python 2.x 中反引号``相当于repr函数的作用 Python 3.x 中去掉了``这种写法,只允许使用repr函数 Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long 在 Python 2 中 有range()和xrange() ,一般使用xrange()创建迭代对象。 在 Python 3 中,range() 是像 xrange()那样实现,xrange()内置函数已经删除。
13.
python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。
python3里,range()返回迭代器,xrange()不再存在。
14.
''' 用一行代码实现数值交换: a = 1 b = 2 print(a) print(b) print(a,b=b,a) Python3和Python2中 int 和 long的区别? python2有非浮点数准备的int和long类型。int类型最大值不能超过sys.maxint,而且这个最大值是平台相关的。 可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。 python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。 文件操作时:xreadlines和readlines的区别?(python2.3) 返回类型不同: readlines()读取所有行然后把它们作为一个字符串列表返回。 xreadlines返回的是生成器 readline()方法读取整行,包括行结束符,并作为字符串返回; 每次读取一行,返回的是一个字符串对象,保持当前行的内存 列举布尔值为False的常见值? bool(0) bool(None) bool("") bool(()) bool([]) bool({}) 字符串、列表、元组、字典每个常用的5个方法? 字符串:索引、查找find('e')、移除空白strip()、长度len()、替换replace('h', 'H') 列表:切片[1:4]、追加append()、插入insert()、修改li[2]="修改"、删除remove和pop 元组:索引ages[3]、切片name[0:2]、长度len()、创建tuple、删除del 字典:keys()返回包含字典所有key的列表;values()返回包含字典所有value列表;items()返回一个包含所有键值的列表;get()查看字典key对应的值;len()查看字典长度。 ''''
15.
(1))pass的作用? 1、空语句 do nothing 2、保证格式完整 3、保证语义完整 (2))Python中的*arg和**kwarg *args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。 **kwargs代表的关键字参数,允许你使用没有事先定义的参数名。 位置参数一定要放在关键字参数的前面。 作用:使用*args和**kwargs可以非常方便的定义函数,同时可以加强扩展性,以便日后的代码维护。 示例如下: ''' #args def fun_var_args(farg, *args): print "arg:", farg for value in args: print "another arg:", value fun_var_args(1, "two", 3) # *args可以当作可容纳多个变量组成的list ''' ''' #**kwargs def fun_var_kwargs(farg, **kwargs): print "arg:", farg for key in kwargs: print "another keyword arg: %s: %s" % (key, kwargs[key]) fun_var_kwargs(farg=1, myarg2="two", myarg3=3) # myarg2和myarg3被视为key, 感觉**kwargs可以当作容纳多个key和value的dictionary ''' (3)lambda表达式格式以及应用场景? lambda函数就是可以接受任意多个参数(包括可选参数)并且返回单个表达式值得函数。 语法:lambda [arg1 [,arg2,.....argn]]:expression def calc(x,y): return x*y # 将上述一般函数改写为匿名函数: lambda x,y:x*y 应用:1.lambda函数比较轻便,即用即仍,适合完成只在一处使用的简单功能。 2.匿名函数,一般用来给filter,map这样的函数式编程服务 3.作为回调函数,传递给某些应用,比如消息处理。 (4)is和==的区别 ==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等; is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。 (5)Python垃圾回收机制? 1、回收计数引用为0的对象,释放其占用空间 2、循环垃圾回收器。释放循环引用对象 (6)简述Python的深浅拷贝以及应用场景? 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层。 所以对于只有一层的数据集合来说深浅拷贝的意义是一样的,比如字符串,数字,还有仅仅一层的字典、列表、元祖等. 应用: 浅拷贝在拷贝大量数据且不需要改变内部元素的值的时候,能大量的减少内存的使用; 深拷贝在拷贝大量数据的时候,需要在前后内部元素的内容进行改变的时候,可以修改拷贝出来的模板 。
16.
1)Python的可变类型和不可变类型? 可变类型:list、dict、set、可变集合 不可变类型:string、int、float、tuple、不可变集合 2)filter、map、reduce的作用? filter() # 将符合条件的值过滤出来 map(lambda x:x*x , [1,2,3,4,5]) # 根据提供的函数对指定序列做映射 reduce(function, iterable[, initializer]) # 对参数序列中元素进行累积 3)re的match和search区别? re.match 从头开始匹配 re.search 匹配包含 match与search函数功能一样,match匹配字符串开始的第一个位置,search是在字符串全局匹配第一个符合规则的。 4)至少列举8个常用模块都有那些? 1、sys:用于提供对解释器相关的访问以及维护,并有很强的交互功能 2、time: 时间模块 3、os:用于提供操作系统模块 4、ashlib:用于加密相关的操作 5、random:生成随机变量 6、pickle:用于python特有的类和pthon的数据类型间进行转换 7、datetime:date和time的结合体 8、re:正则表达式模块 5)一行代码实现9*9乘法表 print("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10))) 6)什么是正则的贪婪匹配? >>>re.search('ab*c', 'abcaxc') <_sre.SRE_Match object; span=(0, 3), match='abc'> >>>re.search('ab\D+c', 'abcaxc') <_sre.SRE_Match object; span=(0, 6), match='abcaxc'> 贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。 非贪婪匹配:就是匹配到结果就好,就少的匹配字符。 7)求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) ) 8)求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
17.
18.
19.
20.