面试题

第一章 python基础

1.为什么学习python?
自己对编程的兴趣
通过朋友的介绍
语言简洁,简单易懂,具有强大的第三方库
跨平台性好, web开发,自动化测试运维,爬虫,人工智能,大数据处理都能做
具有着非常火爆的社区  
很多有名的大公司都在用
2.通过什么途径学习的Python?
1.学校也有python相关的选修课
2.依靠书籍,自主学习
3.网上的搜索资料  
视频 :51cto   慕课网  
网站 :菜鸟教程  官方文档   博客论坛 简书
读书 :Cook book  核心编程2\3   流畅的python  python学习手册
3.公司线上和开发环境使用的什么系统?
# 答案:
公司线上使用的是Linux系统, 具体版本为centos7.0
开发环境使用的是Windows系统

# 拓展
- 开发环境:
就是与测试环境分开的独立客户机、服务器、配置管理工具等。
- 使用阶段:
1.开发人员每日上传代码到开发环境进行自测。
2.demo会议时,PM同学和开发同学一起测试。(项目开发流程)
发布频率:每天发布1-2次,做持续集成,改完code立马提交。

# 持续集成 优点是可以避免传统模式在集成阶段的除虫会议。持续集成主张项目的开发人员频繁的将他们对源码的修改提交(check in)到一个单一的源码库,并验证这些改变是否对项目带来了破坏。

- 测试环境:
测试环境是指测试人员利用一些工具及数据所模拟出的、接近真实用户使用环境的环境,测试环境的目的是为了使测试结果更加真实有效。测试环境应该与开发环境分隔开,使用独立的客户机、服务器和配置管理工具。
   
- 线上环境:
也称发布环境,真实用户访问的环境,要求不能有任何BUG,且不能频繁发布,这样对用户体验性不好。
4.Python和Java、PHP、C、C#、C++等其他语言的对比?
1、c,编译型语言它是现代编辑语言的老一辈了,在现代应用中使用不多,所有大部分语言,写法都和c语言差不多,常常被用作学习其他语言的基础
2、PHP解释型语言 主要适用于网页编辑,而python适合与各个领域
3、c++编译型语言 是面向对象的c语言,由于偏底层,所以性能非常高,主要用在一个要求高性能的领域
4、java混合型语言 学习起来python要比java简单快捷的多,java从c++的系统语言中继承5、python是解释性语言,不需要额外的编译过程,而c#必须编译后才能执行
6、python程序是开源的,c# 混合型语言 却不是开源的,python可以跨平台
7、python比c++等这类语言,更容易学习,语法规则简单,语意化,易读易懂,容易维护
5.简述解释型和编译型编程语言?
#解释型语言:
1.解释型语言即代码在执行前边解释边执行, 如Python, Java,Ruby,Perl等语言.
2.解释型语言的优点在于省去了运行前预先整体编译的过程, 该特点成就了解释型语言良好的可移植性, 只要计算机中有该语言的解释器(虚拟机)即可运行. 但由于每一次运行都需要进行一次解释, 所以导致了解释型语言的运行效率低的特点.
3.一些网页脚本,服务器脚本以及辅助开发接口这样的对速度要求不高,对不同系统的兼容性有一定要求的程序则通常使用解释性语言
#编译型语言:
1.编译型语言即代码在执行前将代码进行整体编译形成计算机可以直接识别的二进制文件, 如C, C++等语言.
2.编译型语言的优点在于预先编译,所以在执行过程中计算机不需要再进行翻译,所以执行效率很高. 但由于不同计算机系统识别的二进制文件形式不同, 编译型语言经过编译后的二进制文件不能被所有系统识别, 所以导致了编译型语言的跨平台性差.另外代码经过编译后程序不可修改, 所以保密性好.
3.由于编译型语言的程序运行效率高, 执行速度快,同等条件下对系统的要求比较低, 因此适用于开发操作系统, 大型应用程序, 数据库等.
6.Python解释器种类以及特点?
# Python解释器共有5种:CPython, IPython, PyPy, Jython, IronPython.
1.CPython:官方版本解释器, 该解释器由C语言开发, 在命名行下运行python,就是启动CPython解释器,是使用最广的Python解释器。还可以自行编写Python解释器来执行Python代码.
2.IPython:该解释器是基于CPython之上的一个交互式解释器,内核其实是调用IE,IPython只是在交互模式下比CPython解释器有所增强, 执行代码的能力与CPython完全一样.属于灵活、可嵌入的解释器.
3.PyPy:该解释器的目标是执行速度的提高, PyPy采用JIT技术, 对Python代码进行动态编译, 所以可以显著提高Python代码的执行速度.
4.Jython:该解释器是运行在Java平台上的解释器, 可以直接把Python代码编译成Java字节码执行.
5.IronPython:该解释器是运行在.Net平台上的Python解释器, 可以把Python代码直接编译成.Net字节码.
7.位和字节的关系?
1.位(bit)
英文bit, 表示二进制位.位是计算机内部数据存储的最小单位, 一个二进制位只可以表示0或1两种状态.
2.字节(byte)
英文byte, 用大写的"B"表示.字节是计算机中数据处理的基本单位. 计算机中以字节为单位存储和解释信息,并规定一个字节由八个二进制位构成, 即1个字节等于8个比特.

1 Byte = 8 bit
# 数据存储是字节(Byte)为单位,数据传输大多是以位(bit)为单位.
8.b、B、KB、MB、GB 的关系?
-8b(bit)=1B(Byte)
-1KB(Kilobyte 千字节)=1024B;  
-1MB(Megabyte 兆字节)=1024KB;
-1GB(Gigabyte 吉字节)=1024MB;
-1TB(Trillionbyte 太字节)=1024GB;
-1PB(Petabyte 拍字节)=1024TB;
-1EB(Exabyte 艾字节)=1024PB;
-1ZB(Zettabyte 泽字节)1024EB;
-1YB(YottaByte 尧字节)1024ZB;
-1NB(NonaByte )=1024YB;
-1DB(DoggaByte)=1024NB;

# 换算关系
1TB = (1*1024)GB = (1*1024*1024)MB = (1*1024*1024*1024)KB = (1*1024*1024*1024*10224)B
9.请至少列举个 5个PEP8 规范(越多越好)。
1.缩进(Indentation):默认4个空格为一个缩进层次, 推荐在新项目中仅使用空格而不是制表符.
2.行最大长度(Maximum Line Length):限制行最大79个字符, 对顺序排放的大块文本, 推荐将长度限制在72字符.
3.空行(Blank Lines):用两行空行分割顶层函数和类的定义, 类内方法的定义用单个空行分割. 额外的空行可被用于分割相关函数组成的群.当空行用于分割方法的定义时, 'class'行和第一个方法定义之间也要有一个空行.
4.导入(Import):通常应该在单独的行中导入一个模块,而不是一行中导入多个模块; 导入模块应该在文件的顶部, 仅在模块注释和文档字符串之后, 在模块的全局变量和常量之前.导入顺序为:标准库模块,相关的主包的导入,特定应用的导入.每组导入之间放置一个空行.
5.空格(Whitespace in Expressions and Statements):
(1).紧挨着圆括号,方括号和花括号出不应该出现空格:print([1, 2])
(2).紧贴在逗号,分号或冒号前不应该出现空格, 而应该在其后应该有空格:print(x, y, z)
(3).紧贴着函数调用的参数列表前开式括号前不应出现空格:func(args)
(4).紧贴在索引或分片开式的开式括号前不应该出现空格:value = dic["name"]
(5).运算符两边应该各有一个空格.

6. 命名规范
-尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。
-模块命名尽量短小,使用全部小写的方式,可以使用下划线。
-包命名尽量短小,使用全部小写的方式,不可以使用下划线。
-类的命名使用CapWords(驼峰)的方式,模块内部使用的类采用_CapWords的方式。
-异常命名使用CapWords+Error后缀的方式。
-函数命名使用全部小写的方式,可以使用下划线。
-常量命名使用全部大写的方式,可以使用下划线。
-类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
-类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
-为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明__a,访问时,只能通过Foo._Foo__a,避免歧义。
-类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。

7. 注释:
注释最好使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
-块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。
-行注释,在一句代码后加注释。
-避免无谓的注释。
10.求结果:求出v1~v6的值
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

# 结果:
v1 == 1
v2 == 3
v3 == 0
v4 == 1
v5 == 1
v6 == False

# 知识点(方式一)
1.两个非零数进行'与运算',即and运算, 取and右侧的数字, 如果一侧为0, 则取0.
2.两个非零数进行'或运算', 即or运算, 取or左侧的数字, 如果一侧为0, 则取非0一侧.
2.'与或非运算'优先级为 : not > and > or
   
# 知识点(方式二)
1.'与或非运算'优先级为 : not > and > or
2.x or y 的值只可能是x或y. x为真就是x, x为假就是y
3.x and y 的值只可能是x或y. x为真就是y, x为假就是x
11.ascii、unicode、utf-8、gbk 区别?
1.asscii码: 最多只能用8位表示,所以最多只能表示256个字符. 不识别中文.
2.Unicode码: 中文占4个字节,英文2个字节
3.utf8: 中文3字节,欧洲2字节, 美洲1字节
4.gbk:中文2个字节,英文1字节
   
Ascii :英文: 81 字节 = 1字符    不支持中文
Unicode:英文: 162 字节 = 1字符   中文: 4字节 = 1字符
Utf-8 :英文: 8bit = 1字节 = 1字符  中文:243 字节 = 1字符
Gbk   :英文: 1字节 = 1字符         中文: 2字节 = 1字符
12.字节码和机器码的区别?
1.当python程序执行时,Python内部会将源代码编译成字节码,并保存成以.pyc为扩展名的文件,若果下次在源码没有改变的情况下,python会加载该文件,这是对启动速度的一种优化.该过程是一个简单的翻译过程,生成的字节码是源代码底层的,与平台无关的表现形式, 字节码是计算机不能直接识别的.
2.程序要完成运行必须经Python虚拟机解释字节码后生成机器码, 机器码是计算机能够识别的语言.python是一门解释型语言,其实解释的并不是源代码, 而是在解释字节码.
13.三元运算规则以及应用场景?
1.三元运算符是分支语句实现的简单逻辑,功能与'if....else'流程语句一致
2.三元运算符规则 : if条件成立的执行结果<- if 条件 else ->if条件不成立的执行结果
3.应用场景 : 由于三元运算符结构简单,执行效率更高,当需要使用if分支语句实现的简单逻辑时, 可以将if分支语句整合嵌套为三元运算符.

# 拓展:C语言实现三元运算符
C ? X : Y  # C为条件, X是C为True时的结果, Y是C为False时的结果
14.列举 Python2和Python3的区别?
1.Python3对Unicode字符的原生支持
-Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode,Python3只支持unicode的string。
# python2和python3字节和字符对应关系为:
python2    python3    表现    转换    作用
str         bytes     字节   encode  存储
unicode     str       字符   decode  显示

2. Python3采用的是绝对路径的方式进行import。
- Python2中相对路径的import会导致标准库导入变得困难。Python3中,如果需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。

3.Python2中存在老式类和新式类的区别,Python3统一采用新式类。新式类声明要求继承object,必须用新式类应用多重继承。

4.Python3使用更加严格的缩进。Python2的缩进机制中,1个tab和8个space是等价的,所以在缩进中可以同时允许tab和space在代码中共存。

-print语句被python3废弃,统一使用print函数

-exec语句被python3废弃,统一使用exec函数

-不相等操作符"<>"被Python3废弃,统一使用"!="

-long整数类型被Python3废弃,统一使用int

-xrange函数被Python3废弃,统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率

-Python3中这些方法再不再返回list对象:dictionary关联的keys()、values()、items(),zip(),map(),filter(),但是可以通过list强行转换:
-迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)

-raw_input函数被Python3废弃,统一使用input函数

-字典变量的has_key函数被Python废弃,统一使用in关键词

-file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型

-异常StandardError 被Python3废弃,统一使用Exception

-浮点数除法操作符///区别
Python2:/是整数除法,//是小数除法
Python3:/是小数除法,//是整数除法。
       
- round函数返回值区别
Python2,round函数返回float类型值
   Python3,round函数返回int类型值

-比较操作符区别
Python2中任意两个对象都可以比较
Python3中只有同一数据类型的对象可以比较
15.python2项目如何迁移到python3
1.清查依赖包, 不支持 python3 lib 寻找替代品(常用 lib 基本都没问题).
2.将现有代码转写成 py2/3 兼容代码.
3.修复单元测试,用 tox python2.7 python3.6 下跑单元测试, 保证后续代码不会 broken.
4.替换本地开发的 devbox sandbox 环境.
5.灰度切换线上环境.

https://blog.csdn.net/u011089523/article/details/69681099
http://www.php.cn/python-tutorials-85889.html
16.用一行代码实现数值交换
a = 1
b = 2

# 知识点: 平行赋值
a, b = b, a
17.python3中的int与python2中的long的区别
# python2
1.python2中数值类型分为int(整形), long(长整形), float(浮点实际值),complex(复数).
2.其中int为整数, 没有小数点的正或负整数.
3.long,无限大小的整数, 语法规范上是在数字后面加一个L.
# python3
1.python3中数值类型只有int(整形), float(浮点数), complex(复数), 在python3中可以认为将python2中的int与long合并为python3中的int.
18.xrange和range的区别?
1.在python2中, range()函数生成的是一个列表,而xrange()函数是一个具有惰性运算机制的可迭代对象.
2.python3中只有range()函数,在python3中range()函数也是生成一个具有惰性运算机制的可迭代对象.
3.range和xrange都是在循环中使用,输出结果一样。
4.xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,性能较好。

# 惰性计算(Lazy Evaluation),又称懒惰计算、懒汉计算,是一个计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。
19.如何实现字符串反转?如: name = "wupeiqi”,反转为name = "iqiepuw”.
1.name = "wupeiqi”
name = name[: : -1]

2.def reversed_str(str):
    return a_string[::-1]
reversed_str( "wupeiqi")
20.文件操作时:xreadlines和readlines的区别?
1.readlines()读取文件所有内容, 按行为单位放到一个列表,返回list类型.
2.xreadlines()读取文件返回一个迭代器, 来循环操作文件的每一行.利用循环取值结果和readlines是一样的, 但由于xreadlines的惰性运算机制, 在读取大文件时, 可以很好的减小内存的压力.
21列举布尔值为False的常见值?
0,“”,{},[],(),set(),False,不成立的表达式,None
22.字符串、列表、元组、字典每个常用的5个方法?
字符串用单引号(')或双引号(")括起来,不可变
1,find通过元素找索引,可切片,找不到返回-1
2,index,找不到报错。
3,split 由字符串分割成列表,默认按空格。
4,captalize 首字母大写,其他字母小写。
5,upper 全大写。
6,lower 全小写。
7,title,每个单词的首字母大写。
8,startswith 判断以什么为开头,可以切片,整体概念。
9,endswith 判断以什么为结尾,可以切片,整体概念。
10,format格式化输出
11,strip 默认去掉两侧空格,有条件, 12,lstrip,rstrip 14,center 居中,默认空格。
15,count查找元素的个数,可以切片,若没有返回0
16,expandtabs 将一个tab键变成8个空格,如果tab前面的字符长度不足8个,则补全8个,
17,replace(old,new,次数)
18,isalnum字符串由字母或数字组成 isalpha, 字符串只由字母组成  isdigit 字符串只由数字组成
19,swapcase 大小写翻转
20,for i in 可迭代对象。   
字典:
增:dic[“键”] = “值”    
	setdefault(“键”,“值”)
删: pop(键)            有返回值,返回的是值
    popitem              随机删除,有返回值以元祖的形式进行返回,第一个是键,第二个是值
    del                 删除整个字典 可以通过键删除
    clear               清空
改:dic[“键”] = “值”    不存在就是改
    update({})          参数是一个字典   有就改,没有就添加
查:get(键)            没有返回NONE 可以自定义返回值
其他操作  dic.keys(),   获取字典的键
          dic.values()   获取字典的值
          dic.items()   获取字典的键值 ,以元祖形式返回         
23.is 和==的区别
is  比较的是内存地址
== 比较的是值
24.1,2,3,4,5能组成的互不相同且无重复的三个数
l = [1,2,3,4,5]
l1=[]
 for i in l:
     for j in l:
         for m in l:
             if i!=j and i!=m and j!=m:
                 l1.append(str(i)+str(j)+str(m))
 print(len(l1),l1)
25.什么是反射,反射的应用场景
反射:某个命名空间中的某个"变量名",获取这个变量名对应的值
文件或者input输入的时候我们会得到某个变量名,这时候我们可以通过反射的方法来获取这个变量名对应的值
26.简述python的深浅拷贝
浅拷贝只拷贝一层[1,2,[3,5]],这时候的浅拷贝后[3,5]的内存地址还是原来的。切片或者赋值都是浅拷贝
拷贝可变数据类型 不可变数据类型不拷贝
深拷贝完全拷贝,与原来的完全没有关系  不可变数据类型使用原来内存地址
27.python垃圾回收机制
 引用计数
#原理:当一个对象的引用被创建或者复制时,对象的引用计数加1;
# 当一个对象的引用被销毁时,对象的引用计数减1,
# 当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,
# 可以将其内存释放掉。
# 优点:引用计数有一个很大的优点,即实时性,任何内存,一旦没有指向它的引用,
# 就会被立即回收,而其他的垃圾收集技术必须在某种特殊条件下才能进行无效内存的回收。
# 缺点:引用技术存在一个很大的问题-循环引用,因为对象之间相互引用,每个对象的引用都不会为0,
# 所以这些对象所占用的内存始终都不会被释放掉。
# 标记清除
#标记-清除只关注那些可能会产生循环引用的对象
# 缺点 标记和清除的过程效率不高
# 分代回收
# 将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,
# Python默认定义了三代对象集合,垃圾收集的频率随着“代”的存活时间的增大而减小。
# 也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
# 那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
# 如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长


# 1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,
# 然后清除其在内存的空间。当然除了引用计数为0的会被清除,
# 还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。
# 2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。

 

28.python的可变类型和不可变类型
可变数据类型:列表、字典、可变集合
不可变数据类型:数字、字符串、元组、不可变集合
29.求结果
v = dict.fromkeys(['k1','k2'],[])
v['k1'].append(666)
print(v)
v['k1']=777
print(v)

执行结果:
{"k1":[ 666],"k2":[666]}  #此处执行的是浅拷贝
{"k1":777,"k2":[666]}   
30.一行代码删除列表里重复的值
可以利用集合去重的功能进行删除

 

31.如何实现"1,2,3"变成['1','2','3']
s = "1,2,3"
print(s.split(","))

 

32.如何实现['1','2','3']变成"[1,2,3]
[int(i) for i in ["1","2","3"]]

 

33.比较a = [1,2,3]和b=[(1),(2),(3)]和c[(1,),(2,),(3,)]的区别?
a 和 b 里面的元素都是int类型
c 里面的元素都是元组类型

 

34.用一行代码生成[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  [i*i for i in range(1,11)]
  [i**2 for i in range(1,11)]

 

35.常用字符串格式化有哪几种
a = "python"  b = "java"
1. print("I like %s and %s" %(a, b))
2. print("I like {} and {}".format(a, b))
3. print(f"I like {a} and {b}")

 

36.什么是断言(assert)应用场景
Python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息
AssertError不是在测试参数时应该抛出的错误。

 

37.有两个字符串a和b 每个字符串有逗号分隔的一些字符,按每个字符串的第一个值,合并a和b到c
a=['a,1','b,3,22','c,3,4']
b = ['a,2','b,1','d,2']
按每个字符串的第一个值,合并a和b和c
c = ['a,1,2','b,3,22,1','c,3,4','d,2']
---------------------------------------------------------------------------------------
res = {}
for i in a:
    res[i[0]] = i.split(",")

for j in b:
    if j[0] in res:
        res[j[0]].append(j[2:])
    else:
        res[j[0]] = j.split(",")
c = [",".join(value) for value in res.values()]
print(c)
38.有一个多层嵌套列表A=[1,2,[3,4,['434',...]]
def func(a):
    for i in a:
        if not isinstance(i, list):
            print(i)
        else:
        	func(i)
func(A)
39.a=range(10),a[::3]的结果是
py2: [0,3,6,9]
py3: range(0,10,3)
    
a = range(10),a[::-3]  
py2:[9,6,3,0]
py3:range(9,-1,-3)
40.下面哪个命令可以从虚拟环境中退出
A:deactivate
B:exit
C:quit
D:以上均可
A
41.将列表内的元素,根据位数合并成字典
lst = [1,2,4,8,16,32,64,128,256,512,1024,32769,65536,4294967296]
dic = {}
for i in lst:
	if len(i) in dic:
        dic[len(str(i))].append(i)
    else:
        dic[len(str(i))] = [i]
结果:{1: [1, 2, 4, 8], 2: [16, 32, 64], 3: [128, 256, 512], 4: [1024], 5: [32769, 65536], 10: [4294967296]}
42.请尽量用简洁的方法将二维数组转换成一堆数组
例:转换前 lst = [[1,2,3],[4,5,6],[7,8,9]]
转换后lst = [1,2,3,4,5,6,7,8,9]
new_lst = []
for i in lst:
	new_lst.extend(i)
lst = new_lst
43.将列表按下列规则排序,补全代码
1.正数在前负数在后
2.正数从小到大
3.负数从大到小
排序前[7,-8,5,4,0,-2,-5] 排序后[0,4,5,7,-2,-5,-8]
补全代码:1.sorted(lst,key=lambda x:____)
l = sorted(lst,key=lambda x:(x<0,abs(x)))
44.哈希冲突回避算法有哪几种,分别有什么特点
https://zhuanlan.zhihu.com/p/29520044
https://www.jianshu.com/p/4d3cb99d7580
45.简述python的字符串驻留机制
https://zhuanlan.zhihu.com/p/35362912  
我们都知道python中的引用计数机制,相同对象的引用其实都是指向内存中的同一个位置,这个也叫做“python的字符串驻留机制”
python的引用计数机制,并不是对所有的数字,字符串,他只对“  [0-9] [a-z] [A-Z]和"_"(下划线)  ”有效,当字符串中由其他字符比如“! @ # ¥ % -”时字符驻留机制是不起作用的。
46.以下代码输出是什么?list=['a','b','c','d','e'] print list[10:]
A. [ ]
B. 程序异常
C. ['a','b','c','d','e']
D 输出空

A
47.python语言什么类型的数据才能作为字典的key
A. 没有限制
B. 字母数字下划线
C. 字母
D. 可被hash的类型

D  不可变类型
48.以下两段代码的输出一样吗,占用系统资源一样码,什么时候要用xrange代替range
for i in range(1):print i
for i in xrange(1):print i
输出一样,占用系统资源不一样,range是一个列表,xrange是一个可迭代对象
当range的数字比较大时,xrange会省很多空间
49.如下代码段
a = [1,2,3,[4,5],6]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
b.append(10)
c[3].append(11)
d[3].append(12)
请问a,b,c,d的值为

a = [1,2,3,[4,5,11],6,10]
b = [1,2,3,[4,5,11],6,10]
c = [1,2,3,[4,5,11],6]
d = [1,2,3,[4,5,12],6]
50.现有字典d = {'a':26,'g':20,'e':20,'c':24,'d':23,'f':21,'b':25}请按照字段中的value字段进行排序
res = sorted(d, key=lambda x:d[x])
51.给定两个list A,B,请用python找出A,B中相同的元素和A,B中不同的元素
A = [1,2,3,4,5,6]
B = [3,4,5,6,7,8,]
print(set(A)&set(B))
print(set(A)^set(B))
执行结果:
{3, 4, 5, 6}
{1, 2, 7, 8}
52.下列叙述错误的是
A. 栈是线性结构
B. 队列是线性结构
C. 线性列表是线性结构
D. 二叉树是线性结构
---------------------------------------------------------------
D #常用的线性结构有:线性表,栈,队列,双队列,数组,串。
  #常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等),图
  #线性结构:一个有序数据元素的集合,数据元素之间是一对一关系的数据结构
  #非线性结构:没有对应关系的,一对多的,多对多的
53.一个栈的输入序列为1,2,3,4,5,则下列序列中不可能是栈的输出顺序的是
A. 1,5,4,3,2
B. 2,3,4,1,5
C. 1,5,4,2,3
D. 2,3,1,4,5
---------------------------------------------------------------C  #栈:先进后出
54.下图哪些PEP被认为涉及到了代码规范
PEP是Python Enhancement Proposals的缩写。一个PEP是一份为Python社区提供各种增强功能的技术规格,也是提交新特性,以便让社区指出问题,精确化技术文档的提案
A. PEP7
B. PEP8
关于代码的规范
C. PEP20
关于可读性的规范
D. PEP257
关于文档字符串的规范
---------------------------------------------------------------
B
https://blog.csdn.net/zV3e189oS5c0tSknrBCL/article/details/81463984
55.下面哪些是python合法的标识符,哪些是python的关键字
1. int32
2. 40XL
3. saving$
4. print
5. this
6. self
7.0x40L
8.true
9.big-daddy
10.True
11.if
12. do
13.yield
---------------------------------------------------------------
合法标识符:1,5,6,8,12
python关键字:4.10,11,13
python2中True和False是变量可以对其进行赋值
python3中True和False是关键字
56.从0-99这100个数中随机取出10个,要求不能重复,可以自己设计数据结构
import random
l  = random.sample(list(range(100)),10)
print(l)

print(set(random.sample(range(100),10)))

57.python判断一个字典中是否有这些key:'AAA','BB','C','DD','EEE'(不使用for while)
dic = {1:'1',2:'2','AA':'test'}
if "AAA" not in dic:
    if "BB" not in dic:
        if "C" not in dic:
            if "DD" not in dic:
                if "EEE" not in dic:
                    print("么得啊")

 

58.有一个list['This','is','a','Boy','!'],所有元素都是字符串,对他进行大小写无关的排序
lst = ['This','is','a','Boy','!']
ret =  sorted(lst,key=lambda x:x.upper())
print(ret)
答案:['!', 'a', 'Boy', 'is', 'This']

for index,i in enumerate(range(120)):
    print(index,chr(i))
    
print(ord("!"))  查询其ascii
59.描述下dict的item()方法与iteritems()的不同
python字典的items方法作用:是可以将字典中的所有项,以列表方式返回。如果对字典项的概念不理解,可以查看Python映射类型字典基础知识一文。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。
dic = {"k1":[1,2]}
print(dic.items())
结果:dict_items([('k1', [1, 2])])

python字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。


Python 3.x 里面,iteritems() 和 viewitems() 这两个方法都已经废除了,而 items() 得到的结果是和 2.x 里面 viewitems() 一致的。
60.请列举你所知道的python代码检测工具及他们间的区别
pychecker是一个python代码静态分析工具,它可以帮助python代码找bug会对代码的复杂度提出警告
pulint高阶的python代码分析工具,分析python代码中的错误查找不符合代码风格标准



python代码检查工具:
Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,相对于目前热度比较高的Pylint来说,Flake8检查规则灵活,支持集成额外插件,扩展性强。Flake8是对下面三个工具的封装:
1)PyFlakes:静态检查Python代码逻辑错误的工具。
2)Pep8: 静态检查PEP8编码风格的工具。
3)NedBatchelder’s McCabe script:静态分析Python代码复杂度的工具。
不光对以上三个工具的封装,Flake8还提供了扩展的开发接口。

61.介绍一下try except 的用法和作用
try....except执行try下的语句,如果发生异常,则执行过程跳到except语句,对每个except分支顺序尝试执行,如果异常与except中的异常组匹配,指行相应的语句.

62.输入一个字符串,返回倒序排列的结果如:abcdef,返回fedcba
s = 'abcdef'
print(s[::-1])

s =list(s)
s.reverse()
print("".join(s))
63.阅读以下代码,并写出程序的输出结果
alist = [2,4,5,6,7]
for var in alist:
    if var % 2 == 0:
        alist.remove(var)
alist的最终结果是?
----------------------------------------------------------------
[4,5,7]
64.现有列表alist = [3,1,-4,-2],按照元素的绝对值大小进行排序
alist = [3,1,-4,-2]
ret = sorted(alist,key=lambda x:abs(x))
print(ret)
65.填空题
1.表达式 3<4<5 是哪一个表达式的缩写()
3 < 4 and 4 < 5
2.获取python解释器版本的方法是()
python -V  cmd里面查看的方式

import sys   
print(sys.version)

3.如果模块是被导入的,__ name __ 的值是(),如果模块是被直接执行的,__ __ name__的值是()
模块名字
'__main__'
4.python的内存管理中,为了追踪内存中的对象,使用了()这一简单技术
python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。所有这些都是自动完成,不需要像C一样,人工干预,从而提高了程序员的效率和程序的健壮性

5.python的标准解释器是由C语言实现的,称为(),有java实现的被称为()
cpython  
jpython
6.python中,()语句能直接显示的释放内存资源
del
7.python的乘方运算符是()
**
66.现有字典mydict和变量onekey,请写出从mydict中取出onekey值的方法(mydict中是否存在onekey的键值不确定)
mysict.get(onekey)
#有则返回值,没有则返回none
67.现有一列表alist,请写出两种去除alist中重复元素的方法,其中
1.要求保留原有列表中元素的排列顺序
alist = [1,2,3,3,4,4,5,6]
lst = []
for i in alist:
    if i not in lst:
        lst.append(i)
print(lst)
2.无需考虑原有列表中元素的排列顺序
alist = [1,2,3,3,4,4,5,6]
list(set(alist))
68.请描述unicode、utf-8、gbk等编码之间的区别
ascii: 早期编码,只支持英文字母和一些符号,不支持中文
unicode: 万国码,能表示多种符号,Unicode只是一个符号集,一个中文占4个字节,英文占2个字节,浪费空间
utf-8: UTF-8就是在互联网上使用最广的一种unicode的实现方式,是一种变长的编码方式,根据不同的符号而变化字节长度.1中文占3字节,1英文占1字节
gbk 中文编码,1中文占2字节,1英文占1字节

a = 19
print(bin(a))
print(oct(a))   
print(hex(a))
执行结果:
0b10011
0o23
0x13
69.哪些情况下,y != x - (x - y)会成立
x,y是两个不相等的非空集合 #右边相当x,y的交集

x={1,2,3,4,5,6,7}
y={1,2,8}
print(x-(x-y)) {1, 2}
70.用python实现99乘法表(两种不同的方法)
1.print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

2.for i in range(1,10):
    for j in range(1,10):
        if j<i:
            print("{}*{}={}".format(i,j,i*j),end="  ")
        elif j==i:
            print("{}*{}={}".format(i, j, i * j))
            break
71.获取list中元素个数和向末尾追加元素的方法分别是什么?
len(),count()
append
72.判断dict中有没有某个key的方法是什么
dict = {'name':'dasd', 'age':10, 'Tel':110}
print(dict.has_key('name')) #python2中的方法 py3移除
print('name' in dict.keys())
print('name' in dict)
73.l = range(100)
如何取第一个到第三个元素用的是  
如何取倒数第二个元素
如何取后十个
l = range(100)
l1 = list(l)[0:3]
l2 = list(l)[-2]
l3 = list(l)[-10:]
74.如何判断一个变量是否为字符串
isinstance('dd',str)
type(变量)
75.list和tuple的区别
都是有序的list可修改 tuple不可修改
76.a = dict(zip(('a','b','c','d','e'),(1,2,3,4,5))) a是什么
print(dict(zip(('a','b','c','d','e'),(1,2,3,4,5))))
#{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}   可迭代的
77.一行代码生成列表[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
print([i**2 for i in range(1,11)])
78.以下说法正确的是 B
A continue是结束整个循环的执行     错误  结束当前循环进入下一循环
B 只能在循环体和switch中使用break语句 正确
C 再循环体内使用break语句或者continue语句的作用相同  错误
D 从多层循环嵌套中退出时只能使用goto语句 错 return exit
79.读代码
for i in range(5,0,-1):
    print(i)
执行结果:5,4,3,2,1

80.写结果
x = 'foo'
y=2
print(x+y)
会报错
81.求结果
kvps = {'1':'1','2':'2'}
theCopy = kvps  #相当于是赋值操作
kvps['1'] = 5
sum = kvps['1']+theCopy['1']
print(sum)
#10
82.python实现tuple和list转化
def func(*args):
    return args
print(func(*[1,2,3]))
强转
83.type(1+2L*3.14)
print(type(1+2L*3.14)) float类型
84.k为整形 下列while循环执行的次数是
k = 1000
count = 0
while k>1:
     print(k)
     k = k/2
     count += 1
 print(count)    10次
85.以下什么是不合法的布尔表达式
A x in range(6)  #代表一个范围
B 3=a       #错误 需要双等
C e>5 and 4==f
D (x-6) >5
86.python不支持的数据类型有
A char   不支持
B int
C float
D list 
88.99(10进制)的八进制表示是什么
print(oct(99))
0o143
90.list对象alist=[{'name':'a','age':20},{'name':'b','age':30},{'name':'v','age':25}]按照age大小排序
alist=[{'name':'a','age':20},{'name':'b','age':30},{'name':'v','age':25}]
ret =sorted(alist,key=lambda i:i['age'])
print(ret)
91.关于python程序的运行性能方面,有什么手段能提升性能?
1、使用多进程,充分利用机器的多核性能
2、对于性能影响较大的部分代码,可以使用C或C++编写
3、对于IO阻塞造成的性能影响,可以使用IO多路复用来解决
4、尽量使用Python的内建函数
5、尽量使用局部变量
6.减少函数调用次数,为了避免重复计算,不要把重复操作作为参数放入循环中
	while i < len(a):
        pass
7.采用映射替代条件查找
    映射(比如dict等)的搜索速度远快于条件语句(如if等)。
    #if查找
    if a == 1:
    b = 10
    elif a == 2:
    b = 20
    ...
    #dict查找,性能更优
    d = {1:10,2:20,...}
8、采用生成器表达式替代列表解析
92.Python是如何进行内存管理的? Python的程序会内存泄露吗? 说说有没有什么发法阻止或检测内存泄露
python内存管理机制 ( Pymalloc ) 包括三个方面:引用计数、垃圾收集、内存池。下面分别予以阐述。
1.  引用计数:python程序中使用的每个变量后台都有一个引用计数。赋值或调用操作,计数加一;相反,删除或移出窗口对象,计数减一。
2.  垃圾收集:将引用计数为0的对象所占有的内存空间释放。还有一个循环垃圾收集器,负责清理未引用的循环,如两个对象互相引用的情况。
3.  内存池:内存池是预先从内存中申请的内存块,当创建小于256 bits 的对象时,从内存池申请内存空间。创建大于256 bits 的对象从内存申请空间。释放内存时,来自内存池的内存空间返回给内存池。这样做的目的是为了减少内存碎片,提升效率。

什么是内存泄漏?
比方说,一台机器出现了内存泄漏的情况(内存 2G,htop 发现 Python 程序占用内存 200M,但是 free -m 发现真实使用内存达到了 1G )。

Python也会内存泄露,Python本身的垃圾回收机制无法回收重写了del的循环引用的对象.检测方法:objgraph
1.程序员管理好每个python对象的引用,尽量在不需要使用对象的时候,断开所有引用
2.尽量少通过循环引用组织数据,可以改用weakref做弱引用或者用id之类的句柄访问对象
3.通过gc模块的接口可以检查出每次垃圾回收有哪些对象不能自动处理,再逐个逐个处理

https://www.jianshu.com/p/2b683cb5837c
93.详细说说tuple,list,dict的用法,他们的特点
元组tuple: 不可变,可嵌套任何数据类型,有序
	查: 按索引查
	增: 当元组的元素里有列表,字典时,可以对列表和字典增删改; 元组可以合并
        t1 = (1,2,3,[1,2,3],{1:'a'},{3,4},(1,2,3))
		t1[-2].append(5)
        print(t1)
        
    删: del 元组 (删除整个元组)
	其他: index,
         count,
         len
        
列表list:可变,不可哈希,有序
    增:append,
       insert,
       extend,
       列表+列表
    删:remove,
       pop(默认删除最后一个,可指定索引删除,有返回值),
       clear(清空),
       del lst[1](删除整个列表,可指定索引删除)
    改: lst[2]='a'
	查: 索引查,for循环
    其他: count,index,reverse,sort,len
        
字典dict:
    特点: 字典的键必须是不可变数据类型; 键唯一; 
    增: dic[“键”] = “值”  # 存在就修改,不存在就添加
        setdefault(“键”,“值”) # 存在就不修改
    删: pop(key) #有返回值
        popitem  # 随机删除,有返回值,以元组形式返回
        del # 可指定键删除
        clear
    改: dic[“键”] = “值”  # 存在就修改,不存在就添加
        update({})  #有就修改,没有就添加
    查: get(key), dic[key]
    其他: dic.keys()
          dic.values()
          dic.items()
    
94.一个大小为 100G 的文件 etl_log.txt, 要读取文件中的内容, 写出具体过程代码?
方法一:
with open("etl_log.txt",encoding='utf8') as f:
    for line in f:
        print(line,end='')
        
方法二: 分段读
    file_size = os.path.getsize("etl_log.txt")
    with open("etl_log.txt",encoding='utf8') as f:
        while file_size:
            content = f.read(1024)
            file_size -= len(content)
95.已知 Alist = [1,2,3,1,2,1,3], 如何根据 Alist 得到 [1,2,3]
l = []
for i in Alist:
    if i not in l:
        l.append(i)
print(l)
96.已知 stra = 'wqedsfsdrfweeddfgdqw'
  1. 如何获得最后两个字符

  2. 如何获得第二个和第三个字符

    1. print(stra[-2:])
    2. print(stra[1:3])
    
97.Alist = ['a','b','c'] ,将 Alist 转化为 'a,b,c' 的实现过程
print(','.join(Alist))
98.已知 ip = '192.168.0.100' 代码实现提取各部分并写入列表
l_ip = ip.split(',')
# 如 10.3.9.12 转换规则为:
#         10            00001010
# 
         3            00000011

#          9            00001001
# 
        12            00001100

# 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
# def sum_ip(ip):
#     l = ip.split('.')
#     s = ''
#     for i in l:
#         b = bin(int(i))[2:]
#         b = (8-len(b)) * '0' + b
#         s += b
#     res = int(s,2)
#     return res
# ip = '10.3.9.12'
# res = sum_ip(ip)
# print(res)
99.python 代码如何获取命令行参数?
sys.argv():
    
	import sys
    user = sys.argv[1]
    pwd = sys.argv[2]
    print(user,pwd)
    命令行:
        C:\Users\Administrator>python D:\s17\面试题\面试题.py ning 123
        ning 123
        
getopt.getopt 

https://www.cnblogs.com/ouyangpeng/p/8537616.html
100.写代码

tupleA = ('a','b','c','d','e')

tupleB = (1,2,3,4,5)

RES = { 'a':1, 'b':2, 'c':3, 'd':4, 'e':5 }

写出由 tupleA 和 tupleB 得到 RES 的具体实现过程

l = zip(tupleA,tupleB)
dic = {}
for i in l:
    dic[i[0]] = i[1]
print(dic)

print(dict(zip(tupleA,tupleB)))
101.选出以下表达式表达正确的选项:
A. { 1:0,2:0,3:0}
B. {'1':0,'2':0,'3':0}
C. { (1,2):0, (4,3):0}
D. { [1,2]:0, [4,3]:0}
E. { {1,2}:0, {4,3}:0}

A,B,C
102.what gets printed()?
kvps = {'1':1,'2':2}
theCopy = kvps.copy()
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print sum

A. 1
B. 2
C. 6
D. 10
E. An exception is thrown

C
103.what gets printed()?
numbers = [1,2,3,4]
numbers.append([5,6,7,8])
print len(numbers)

A.4
B.5
C.8
D.12
E.An exception is thrown

B.5
104.what gets printed()?
names1 = ['Amir','Barry','Chaies','Dao']
if 'amir' in names1:
    print 1
else: 
    print 2

A.1
B.2
C.An exception is thrown

B.2
105.what gets printed()? Assuming python version2.x()
print(type(1/2))

A.int
B.float
C.0
D.1
E.0.5

A,C
>>> print 1/2
0
>>> print(type(1/2))
<type 'int'>
>>> print 1.0/2
0.5
>>>
106.以下用来管理Python库管理工具的是
A.API
B.PIP
C.YUM
D.MAVEN  #Maven的核心功能便是合理叙述项目间的依赖关系

B
107.which numbers are printed() ?
for i in range(2):
    print i
for i in range(4,6):
    print i

A.2,4,6
B.0,1,2,4,5,6
C.0,1,4,5
D.0,1,4,5,6,7,8,9
E.1,2,4,5,6

C.0,1,4,5
108.求结果:
import math
print (math.floor(5.5))

A.5
B.5.0
C.5.5
D.6
E.6.0

import math
print (math.floor(5.5)) #地板  5
print (math.ceil(5.5))  #天花板  6
#math的常用命令
gcd:返回x和y的最大公约数
pi:数字常量,圆周率
109.关于Python 的内存管理,下列说法错误的是:
A.变量不必事先声明
B.变量无需先创建和赋值而直接使用
C.变量无需指定类型
D.可以使用del释放资源

B

Python 是弱类型脚本语言,变量就是变量,没有特定类型,因此不需要声明。
但每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
用 del 语句可以释放已创建的变量(已占用的资源)。
110.下面哪个不是 Python 合法的标识符?
A.int32
B.40xl
C.self
D.name

B
111.下列哪种说法是错误的
A、除字典类型外,所有标准对象均可用于布尔测试
B、空字符串的布尔值是False
C、空列表对象的布尔值是False
D、值为0的任何数字对象的布尔值是False

A  空字典也可以用于布尔测试
dic = {}
print(bool(dic))
False
答案: A 
112.下列表达式的值为True的是
A、5+4j > 2-3j
not supported between instances of 'complex' and 'complex'
Python2 与 Python3 均不支持复数比较大小
B、3>2>2
False
C、(3,2)<("a","b")
not supported between instances of 'int' and 'str'
("3","2")<("a","b")
True
D、"abc">"xyz"
False
113.关于Python的复数,下列说法错误的是
A、表示复数的语法是real + imagej
	Python 中复数的表示方法;
	a = 1 + 2j
	b= 1 + 2j
	print(a,b)
	print(a.imag,a.real)
    结果:(1+2j) (1+2j)
			2.0 1.0
B、实部和虚部都是浮点数
	复数的实部与虚部均为浮点数;
C、虚部后缀必须是j,且必须小写
	虚部的后缀可以是 “j” 或者 “J”;
D、方法conjugate(共轭的),返回复数的共轭复数
	复数的 conjugate 方法可以返回该复数的共轭复数
    a = 1 + 2j
	print(a.conjugate())
    (1-2j)
答案:C
114.关于字符串下列说法错误的是
A、字符应视为长度为1的字符串
	容量不同:字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
	占用内存空间大小不同:字符常量占一个字节的内存空间,字符串常量占的内存字节数等于字符串中字节数加1。增加	的一个字节用来存放字符‘\0’,作为字符串的结束标志。
B、字符串以\0标志字符串的结束
C、既可以用单引号,也可以用双引号创建字符串
D、在三引号字符串中可以包含换行回车等特殊字符
答案:A
115.以下不能创建一个字典的语句是
A、dic1={}
B、dic2={3:5}
C、dic3={[1,2,3]:"usetc"}
D、dic4={(1,2,3):"usetc"}
答案:C ,字典的键不能是可变数据类型
116、python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值操作:跟原对象一样的值与内存空间,相当于是完全赋值
l1 = [1,2,[3,4]]
l2= l1
print(id(l1),id(l1[2]),id(l2),id(l2[2]))
执行结果:2696598203336 2696598203144 
		2696598203336 2696598203144

浅拷贝: 只能赋值第一层,第二层的内存地址还是不能完全复制过来
python中以下这这几种方式来实现浅拷贝:
完全切片操作:B = A[:]
利用工厂函数:B = list(A) 或 B = dict(A) 等
使用copy模块的copy函数:B = copy.copy(A)
l1 = [1,2,[3,4]]
l2= l1.copy()
print(id(l1),id(l1[2]),id(l2),id(l2[2]))
执行结果:2537051663304 2537051663112 
		2537051734280 2537051663112

深拷贝:深层拷贝,与原对象完全无关
import copy
l1 = [1,2,[3,4]]
l2= copy.deepcopy(l1)
print(id(l1),id(l1[2]),id(l2),id(l2[2]))
执行结果:2486777490376 2486777490184 
		2486777561352 2486777561288
117、描述在python中的元组,列表,字典的区别,并且分别写一段定义,添加,删除,操作的代码片段
  元组tuple: 不可变,可嵌套任何数据类型,有序
	查: 按索引查
	增: 当元组的元素里有列表,字典时,可以对列表和字典增删改; 元组可以合并
        t1 = (1,2,3,[1,2,3],{1:'a'},{3,4},(1,2,3))
		t1[-2].append(5)
        print(t1)
        
    删: del 元组 (删除整个元组)
	其他: index,
         count,
         len
        
列表list:可变,不可哈希,有序
    增:append,
       insert,
       extend,
       列表+列表
    删:remove,
       pop(默认删除最后一个,可指定索引删除,有返回值),
       clear(清空),
       del lst[1](删除整个列表,可指定索引删除)
    改: lst[2]='a'
	查: 索引查,for循环
    其他: count,index,reverse,sort,len
        
字典dict:
    特点: 字典的键必须是不可变数据类型; 键唯一; 
    增: dic[“键”] = “值”  # 存在就修改,不存在就添加
        setdefault(“键”,“值”) # 存在就不修改
    删: pop(key) #有返回值
        popitem  # 随机删除,有返回值,以元组形式返回
        del # 可指定键删除
        clear
    改: dic[“键”] = “值”  # 存在就修改,不存在就添加
        update({})  #有就修改,没有就添加
    查: get(key), dic[key]
    其他: dic.keys()
          dic.values()
          dic.items()
118、选择结果
names1 = ['Amir','Barry','Chaies','Dao']
names2 = names1
names3 =  names1[:]
names2[0]='Alice'
names3[1]='Bob'
sum = 0
for ls in (names1,names2,names3):
    if ls[0]=='Alice':
        sum+=1
    if ls[1]=='Bob':
        sum+=10
print(sum)

A、11
B、12
C、21
D、22
E、23
答案:B  
names1
['Alice', 'Barry', 'Chaies', 'Dao'] 
names2   此时是赋值,相当于完全复制,所以其内存空间与值与names1是完全相同的
['Alice', 'Barry', 'Chaies', 'Dao'] 
names3   此时是浅拷贝,所以相当于只拷贝到表层,names3[1]='Bob' 时只改变了names3 中的值
['Amir', 'Bob', 'Chaies', 'Dao']  
119.下列程序输出结果是
x = True
y = False
z = False
if x or y and z:
    print('yes')
else:
    print('no')
 答案:yes
120、1 or 2和1 and 2输出分别是什么 为什么
1 or 2    or判断里面,第一值为真,取第一个就可以  1
1 and 2   and里,必须满足都为真,所以取第二个值   2
121、1<(2==2)和1<2==2的结果分别是什么 ,为什么
1<(2==2)  为False
1<2==2  由于python中不支持连续判断,所以会拆分成 1<2 and 2==2 所以结果为True
122、如何打乱一个排好序的list对象alist
import random
alist=[1,2,3,4]
random.shuffle(alist)
print(alist)
执行结果:[1, 3, 4, 2]
123、如何查找一个字符串中特定的字符 find和index的差异
find
如果字符串查找不存在的,返回-1
index
如果字符串查找不存在的,报错
124.把aaabbcccd这种形式的字符串压缩城a3b2c3d1这种形式
s="aaabbcccd"
lst=[]
for i in s:
    if i not in lst:
        lst.append(i)
        lst.append(str(s.count(i)))
msg="".join(lst)
print(msg)
运行结果:a3b2c3d1


s = "aaabbcccd"
dic ={"name":[]}
for i in s:
    if i not in dic["name"]:
        dic["name"].append(i)
        dic["name"].append(str(s.count(i)))
print("".join(dic["name"]))
125.python一个数如果恰好等于他的因子之和 这个数就成为完数例如6=1+2+3 找出1000以内所有的完数
def func(num):
    res = {1}
    max_divisor = num // 2
    for i in range(2, max_divisor+1):
        div, mod = divmod(num, i)
        if mod == 0:
            res.add(i)
    return res
for i in range(1,1001):
    res = func(i)
    if sum(res) == i:
        print(i)
        
        
def func(num):
    res = {1}
    max_divisor = num // 2
    for i in range(2, max_divisor+1):
        if max_divisor<=i:
            break
        div, mod = divmod(num, i)
        if mod == 0:
            max_divisor = div
            res.add(i)
            res.add(div)
    return res

for i in range(1,1001):
    res = func(i)
    if sum(res) == i:
        print(i)
126.输入一个字符串 输出这个字符串中字符的所有组合
列如 输入字符串'1,2,3'则输出位1,2,3,12,13,23,123(组合数不考虑顺序 所以12,21是等价的)

import math
def func(eg):
    # 构建原子性列表及全部原子集合(即最后一层结果)
    atom_list = [set(i) for i in eg.split(',')]
    all_atom_set = set(eg.split(','))

    # 计算元素个数
    length = len(atom_list)

    # 构建中间字典,key值为包含的字符个数,如第一层{1: [{'1'}, {'2'}, {'3'},{'4'}]}
    res_dict = dict()
    res_dict[1] = atom_list
    res_dict[length] = [all_atom_set]

    if length > 2:
        # 在第一层到总层数的一半时,每一层的结果都是上一层结果基础上分别对原子列表中的每个原子(已包含的去除)求并集(如一层的{1}对应二层的结果为{'1', '2'}, {'1', '3'},{'1', '4'})
        # 在总层数的一半到总层数时,每一层的结果都是全部原子集合对总层数-当前循环层数每个集合的差集,如第3层的结果就是第4层(假设总共4层)分别对第1层集合的差集
        for i in range(2, math.ceil(length/2)+1):
            for j in res_dict[i-1]:
                for k in atom_list:
                    if not k & j:  # 循环上层列表中的集合不包含本次要加入的原子集合
                        tem_set = j | k  # 构建临时集合,进行下一步操作
                        if i not in res_dict:  # 新一层的字典初始化
                            res_dict[i] = [tem_set]
                            res_dict[length-i] = [all_atom_set-tem_set]
                        elif tem_set not in res_dict[i]:  # 加入
                            res_dict[i].append(tem_set)
                            res_dict[length-i].append(all_atom_set-tem_set)

        # 在上层循环中没有倒数第二层结果,需要单独添加
        res_dict[length - 1] = []
        for i in res_dict[1]:
            res_dict[length - 1].append(all_atom_set-i)

    # 输出
    for i in range(1,length+1):
        for j in res_dict[i]:
            print(''.join(j), end=',')

func('1,2,3,4,5')




def func(list,num=0,l=[]):
    if num < len(list):
        for x in range(0,len(list)):
            for i in range(0,len(list)):
                if x != x+i and x+i+num<=len(list)-1:
                    str = list[x] + list[x + i]
                    for n in range(1, num + 1):
                        str = str + list[x + i + n]
                    l.append(str)
        num += 1
        func(list,num)
    l =list+l
    return l
a = '1,2,3'
list = a.split(",")
print(func(list))


l = ['1','2','3']
lst = []
r = 1
while r < len(l):
    count = 0
    for i in range(count,len(l)-1):
        count += 1
        for j in range(count,len(l)): 
            if l[j] == l[i]:
                count += 1
                continue
            if j+r <= len(l):
                j = ''.join(l[j:j+r])
                lst.append(l[i]+j)
            else:
                continue
    r += 1
lst.extend(set(l))
print(lst)
127、执行以下代码后,i 和 n 的值为
1.int i = 10
2.int n = i++%5
A、10,0
B、10,1
C、11,0
D、11,1

i++ 是后加加,在表达式内不自增
int n= i++%5; // i=10进入,n=0,出了表达式 才自增 i=11;  

int i=11
int m= ++i%5; // i=11 进入, 前加加,则先增1,i=12, m=2, 出表达式 i 维持12
答案是:C

128.执行以下代码段后,X的值为
1. int x =10;
2. x+=x-=x-x;
A、10
B、20
C、30
D、40

因为赋值运算符(+=,-=)没有算术运算符的运算优先级高,所以先算x-x,即:
10-10=0。表达式变为x+=x-=0,再按顺序执行赋值运算符。即x+=x,即x=x+x,x=20;
129.对于一个非空字符串,判断其是否可以有一个子字符串重复多次组成,字符串只包含小写字母且长度不超过10000
例:
1.输入"abab"
2.输出True
3.样例解释:输入可由“ab”重复两次组成
例:
1.输入"abcabc"
2.输出True
3.样例解释:输入可由“abc”重复三次组成
例:
1.输入"aba"
2.输出False

答案:
class Solution(object):                         
    def repeatedSubstringPattern(self, s):      
        n=len(s)                                
        for i in range(1,n//2+1):               
            if n%i==0:                          
                a=s[:i];j=i                     
                while j<n and s[j:j+i]==a:      
                    j += i                      
                if j==n:return True             
        return False                            
ret = Solution()                                
print(ret.repeatedSubstringPattern("abcabc"))   
                                                

    
def c(s):
    n = len(s)
    for i in range(1, n // 2 + 1):
        if n % i == 0:
            a = s[:i]
            j = i
            while j < n and s[j:j + i] == a:
                j += i
            if j == n: return True
    return False
print(c("abcabc"))

 

第二章 函数

1.通过代码实现如下转换
二进制转换成十进制: v  = "0b1111011"
print(int("0b1111011",2))
十进制转换成二进制: v = 18
print(bin(18))
print(bin(int("18",10)))
八进制转换成十进制: v="011"
print(int("011",8))
十进制转换成八进制: v =30
print(oct(int("30",10)))
print(oct(v))
十六进制转换成十进制: v="0x12"
print(int("0x12",16))
十进制转换成十六进制: v=87
print(hex(int("87",10)))
2.python递归的最大层数
def fact(n):
   if n==1:
       return 1
   return n * fact(n - 1)
最大是1000,实际998,997.可以通过sys.setrecursionlimit()进行设置
3.列举常见的内置函数
print(all([1,2,3]))   # True
print(all([0,1,2]))   # False
all 一个可迭代对象的所有元素都为真,则返回True


print(any([1,0,0]))     # True
print(any([0]))         # False
any 一个可迭代对象中只要有一个元素为真,则返回True


print(bin(2))   # 0b10
bin 将一个十进制数字转化成一个二进制数字的字符串


print(hex(2))   # 0x2
hex 将一个十进制数字转化成一个十六进制数字的字符串


print(oct(8))   # 0o2
oct 将一个十进制数字转化成一个八进制数字的字符串


b = 2
def func():
  pass
print(callable(b),callable(func))   # False True
callable 判断一个对象是否是可以被调用的,那么什么样才是可被调用的呢,即类似于“test()”这样的写法。函数与类皆可以被调用


code = '''
n = 0
while n < 10:
  print(n)
  n+=1
'''
exec(code)
exec 代码字符串,以代码的形式执行,exec函数的返回值永远为None.

s_list = "[1,2,3,4]"
l = eval(s_list)   # 此时l已经是一个列表对象了
print(l[0])         # 1
eval 将一串基本数据类型的字符串,转化成基本数据类型


l = [1,2,3]
print(dir(l))   # 此时将会打印列表的所有方法
dir 查看某个类型下的所有方法

print(divmod(5,2)) # 结果:(2,1)。5除以2得到商2,余数为1
divmod 获取两个数相除后的商和余数


print(max([4,3,2,8]))   # 结果:8
max 获取某个可迭代对象的最大值

print(min([4,3,2,8]))   # 结果:2
min 获取某个可迭代对象的最小值

print(sum([4,3,2,8]))   # 结果:17
sum 获取某个可迭代对象的和

print(pow(3,3))     # 结果:27
pow 获取a的b次方

print(type("abc")) # 结果:<class 'str'>
type 查看数据类型

print(round(1.345,2))   # 结果:1.34
round 保留小数


f = filter(lambda x : x > 5,range(10))
for index in f:
  print(index)   # 打印结果:6,7,8,9
filter 将一个可迭代对象按某种特定方式过滤,生成一个新的可迭代对象


m = map(lambda x : x * 2,range(10))
for index in m:
  print(index)
map 将一个可迭代对象按某种特定方式处理,生成一个新的可迭代对象。效果与列表生成式一样

frozenset 将一个可迭代对象转化成一个不可变的,如将列表原来可以调用append方法,转化以后将不可调用append方法

l = [3,2,4,8]
print(sorted(l))   # 结果:[2,3,4,8]
sorted 排序反转

list_1 = [1,2,3,4]
list_2 = ['a','b','c','d']
z = zip(list_1,list_2)
for index in z:
  print(index)
zip 将两个或多个列表拼接成一个元组列表

4.filter , map ,reduce作用

filter 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True False,最后将返回 True 的元素放到新列表中。
filter(function, iterable)
function -- 判断函数。
iterable -- 可迭代对象。
返回列表。

map
map(function, iterable, ...)
function -- 函数
iterable -- 一个或多个序列
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
Python 2.x 返回列表。
Python 3.x 返回迭代器。

m = map(lambda x : x * 2,range(10))
for index in m:
   print(index)

b = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
for i in b :
   print(i)

reduce
对参数序列中元素进行累积。和map不同的就在这一点
>def add(x, y) :            # 两数相加
...     return x + y
...
>>> reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
reduce(function, iterable)
function -- 函数,有两个参数
iterable -- 可迭代对象
5.一行代码代码实现9*9的乘法表
print('\n'.join(['\t'.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
6.什么是闭包
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).这个定义是相对直白的,好理解的
内部函数可以正确地引用外部函数的变量,即使外部的函数已经返回。
7.简述,生成器,迭代器,装饰器以及应用场景
迭代器
访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合

生成器
一个函数调用时返回一个迭代器,那这个函数就叫生成器(generator),如果函数中包含yield语法,则这个函数变成生成器
带有yield的函数,而generator iterator则是generator function的返回值,即一个generator对象;
yield的主要效果就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
可以通过yield实现在单线程的情况下实现并发运算效果

def get_line():
   f = open('file',encoding='utf-8')
   while True:
       line = f.readline().strip()
       if line:
           yield line.strip()

line_g = get_line()
for line in line_g:
   print(line.split(','))

装饰器
是一个返回函数的高阶函数
被装饰的函数带有不同个数的参数,所以装饰器需要运用动态函数
一个函数可被多个装饰器装饰
作用:当想给一个函数func()增加某些功能,但又不希望修改func()函数的源代码是可用装饰器,在代码运行期间动态增加功能
8.使用生成器编写fib函数,函数声明为fib(max)输入一个参数max值,使得该函数可以这样调用。
9.一行代码通过filter和lambda函数输出alist=[1,22,2,33,23,32]中索引为奇数的值
alist=[1,22,2,33,23,32]
ss=[x[1] for x in
   filter(lambdax:x[0]%2==1,enumerate(alist))]
print(ss)


def func(a):
   lst =[]
   for i in a:
       if a.index(i)%2==1:
           lst.append(i)
   return lst
ret =func(alist)
print(ret)
10.编写一个函数实现十进制转62进制,分别用0-9A-Za-z,表示62位字母
s=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def change(num):
   ss=''
   while True:
       ss=s[num%62]+ss
       if num//62==0:
           break
       num=num//62
   return ss
print(change(65))


10进制转换成4进制
l=["0","1","2","3"]
def func(num):
   ss = ""
   while 1:
       if [num%4]!=0:
           ss = l[num % 3]  #1
       if num//4==0:
           break
       num = num//4  #3
       return str(num)+ss
print(func(12))
11.实现一个装饰器,限制该函数被调用的频率,如10秒一次
import time
from functools import wraps
def dec(func):
   key=func.__name__
   cache={key:None}
   @wraps(func)
   def inner(*args,**kwargs):
       result=None
       if cache.get(key) is None:
           cache[key]=time.time()
           result=func(*args,**kwargs)
           print('执行函数中')
       else:
           now=time.time()
           if now-cache[key]>10:
               cache[key]=now
               result=func(*args,**kwargs)
               print('执行函数中')
           else:
               print('函数执行受限')
       return result
   return inner
   
@dec
def add(x,y):
   print(x+y)
   
add(1,2)
add(1,3)
time.sleep(10)
add(3,4)
12实现一个装饰器,通过一次调用,使函数重复执行5次
from functools import wraps
def dec(func):
   @wraps(func)
   def inner(*args,**kwargs):
       result=[func(*args,**kwargs) for i in range(5)]
       return result
   return inner
   
@dec
def add(x,y):
   return x+y
print(add(1,2))
13.python 一行print 1-100 偶数列表
k = [n for n in range(1,101) if n%2 == 0]
print (k)

print(list(filter(lambda a:a%2==0,range(1,101))))
14.生成器与函数的区别,并实现
生成器和函数的主要区别在于函数 return a value,生成器 yield a value同时标记或记忆point of the yield 以便于在下次调用时从标记点恢复执行。 yield 使函数转换成生成器.

# 简单实现生成器
def dec():
   n=0
   for i in range(10):
       yield n
       n+=i
for i in dec():
   print(i)
15 列表推导式[i for i in range(10)]和生成式表达式(i for i in range(10))的区别
列表推导式的结果是一个列表。
生成器表达式的结果是一个生成器,它和列表推导式类似,它一次处理一个对象,而不是一口气处理和构造整个数据结构,可以节约内存。
16.map(str,[1,2,3,4,5,6,7,8,9])输出是什么?
答案:
python3: (返回迭代器)
<map object at 0x0000020A1DFF7198>
python2: (返回列表)
['1', '2', '3', '4', '5', '6', '7', '8', '9']

str()是python的内置函数,是把列表的每个元素变成了str类型,然后以列表的形式返回。

语法:
   map(function, iterable, ...)
   
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
# 一个迭代器中的每一个元素都需要去做同一个操作, 并返回一个结果组成一个新的列表的时候map处理.
17.python中定义函数时如何书写可变参数和关键字参数?
1.参数可以传递多个,多个参数之间用逗号分割。
2.混合传参: 位置参数(a) > 动态位置参数(*args) > 关键字参数(b = 1) > 动态关键字参数(**kwargs)
3.对于一个形参只能赋值一次
4.站在形参角度, 位置参数必须传值
5.将变化比较小的值设置成默认参数

def f(a,*args,b = 1,**kwargs):
   print(a,b,args,kwargs)

f(1,2,3,4,5,6,aa = 1,bb = 2)
# 1 1 (2, 3, 4, 5, 6) {'aa': 1, 'bb': 2}

语法:
可变参数直接传入:func(1, 2, 3),也可以传入list或tuple,再通过*args传入:func(*(1, 2, 3))
关键字参数直接传入:func(a=1, b=2),或者dict,再通过**kwargs传入:func(**{'a': 1, 'b': 2})
18.python3.5中enumerate的意思是什么?
enumerate() 枚举函数用于将一个可迭代的对象组合为一个索引序列.获得索引和值.

语法:
enumerate(sequence, [start=0])
- sequence -- 一个序列、迭代器或其他支持迭代对象。
- start -- 下标起始位置。  # 默认为0, 可指定起始下标

# 示例:
l = ['one', 'two', 'three']
for index, i in enumerate(l):   # 也可以用list(enumerate())
print(index, i)
# 结果:
0   one
1   two
2   three
19.说说python中的装饰器, 迭代器: 描述下dict 的 item 方法与iteritems 方法的不同?
1.装饰器:
   1. 装饰器本身就是一个函数
   2.在不改变其他函数源代码以及原调用方式下, 提供额外的功能.
场景:
   它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

2.迭代器:
Python中如果一个对象有__iter__( )方法和__next__( )方法,这个对象是迭代器.
廖雪峰: 可以被next()函数调用并不断返回下一个值的对象称为迭代器.

3.字典items()与iteritems()都是函数, 变量.方法()

1) items():   # python3
Python 中字典items() 函数以列表返回可遍历的(键, 值) 元组数组。

语法:
dict.items()

例题:
dic = {"a":"aa", "b":"bb"}
print(dic.items())      # dict_items([('a', 'aa'), ('b', 'bb')])
# 遍历字典列表
for key,values in dic.items():
   print (key,values)   # a aa   b bb

2) iteritems():   # python2

语法:
dic.iteritems()

<dictionary-itemiterator object at 0xb74d5e3c>
类型: <type 'dictionary-itemiterator'>    #字典项的迭代器
list(dic)
[('url', 'www.iplaypy.com'), ('title', 'python web site')]
20.是否使用过functools 中的函数? 其作用是什么?
functools模块:指那些作用于函数或者返回其它函数的函数,通常只要是可以被当做函数调用的对象就是这个模块的目标。
from functools import reduce, wraps

1.reduce() 函数会对参数序列中元素进行累积。

函数会对可迭代对象进行操作:reduce中的函数会对可迭代对象中的第 1、2 个元素进行操作,得到的结果会与第三个数进行累计计算,直到与最后一个数进行计算,得到最后的结果.
语法:reduce(function, iterable[, initializer])

def add(x, y) :            # 两数相加
return x + y
reduce(add, [1,2,3,4,5])   # 1+2+3+4+5=15

2.warps(): 保留原函数的属性(装饰器的修复技术)

装饰器能够在那个函数执行前或者执行后分别运行一些代码,使原函数的参数就会被修改.

def wrapper1(func):
   @wraps(func)
   def inner(*args, **kwargs):
       ret = func(*args, **kwargs)
       return ret
   return inner

@wrapper1
def func1():
   """
  func1注释的内容
  :return:
  """
   print('func1')

print(func1.__name__)       # func1
print(func.__doc__)         # 显示注释的内容

warps()相当于把每一个传进来的函数的名字进行还原/ 还能显示函数的本质
warps封装这update_wrapper函数, 函数中含有__name__、__module__、__doc__和 __dict__等.

3.偏函数(partial)

 

21.如何判断一个值是函数还是方法?
1.用眼睛看
单独写一个def func():表示一个函数
在类里面定义函数,这个函数就是类的方法。
2.
from types import MethodType, FunctionType
isinstance(funcname,MethodType)
isinstance(funcname,FunctionType)

 

22.请编写一个函数实现将IP地址转换成一个整数.
10.3.9.12 转换规则为:
10            00001010
3             00000011
9             00001001
12            00001100
再将以上二进制拼接起来计算十进制结果: 00001010 00000011 00001001 00001100 = ?


def func(ip):
   a = ip.split('.')
   s = ''
   l = []
   for i in a:
       i = bin(int(i))[2:]    # bin(10) = 0b1010
       i = i.rjust(8, '0')    # 0000 1010
       l.append(i)
   s = s.join(l)
   return s
ret = func('10.3.9.12 ')
print(int(ret, 2))    # 167971084

rjust()语法:
返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串
str.rjust(width[, fillchar])
   -width -- 指定填充指定字符后中字符串的总长度.
-fillchar -- 填充的字符,默认为空格。

    2进制        8进制        10进制            16进制
2进制    -            bin(x, 8) bin(x, 10)           bin(x, 16)
8进制    oct(x, 2)    -         oct(x, 10)           oct(x, 16)
10进制 int(x, 2)    int(x, 8)     -               int(x, 16)
16进制 hex(x, 2)    hex(x, 8) hex(int(x, 10))    -
23.lambda 表达式格式以及应用场景?
lambda (匿名函数)格式:
   函数名 = lambda 参数 :返回值 (参数可以有多个, 表达式只能有一个)

# 函数
def calc(n):
   return n**n
print(calc(10))

# 换成匿名函数
calc = lambda n:n**n
print(calc(10))
   
场景:
1、lambda存在意义就是对简单函数的简洁表示。

2、一般与filter,map这样的内置函数结合使用, 使用起来会更加高效;(此时是真的匿名了)
 map(lambda x:x**2,[1,5,7,4,8])
   
3、作为回调函数,传递给某些应用,比如消息处理

 

24.pass的作用?
1.空语句 do nothing
# 在软件设计阶段时候用来TODO,提醒实现相应的实现(留着以后用)
def log(*args):
pass # please implement this

2.保证格式完整
3.保证语义完整(占位符)
25.*args 和 **kwargs 作用 ?
1.args kwargs名字可以更换 只不过是开发人员们的一个俗成的约定.

2. *args **kwargs允许函数接受不定数量的参数 .
*args可以接受一个或多个非关键字参数, args以一个元祖的方式呈现.
**kwargs接受不定量的关键字参数, kwargs以一个字典的方式呈现.

3. *
1) 打包: 函数接受实参时,按顺序分配给函数形参,如果遇到带∗的形参,那么就把还未分配出去的实参以元组形式打包,分配给那个带∗的形参。
2) 拆分: 把打包了的实参(元组或列表),拆分成单个的,依次赋值给函数的形参。

4. **
1) 打包: **kwargs是把多个关键字参数打包成字典。
2) 拆分: **kwargs是把字典的键值拆成单个的,依次赋值给函数的形参。

 

26.如何在函数中设置一个全局变量?
global() 表示. 不再使用局部作用域中的内容,而改用全局作用中的变量.

a = 12
def func():
   global a  # 加了global表示不再局部创建这个变量了,而是直接使用全局的a.
   a = 15    # 在函数的局部中设置全局变量
   print(a)  # 15 使用的是局部中的全局变量
func()
print(a)      # 15

# 不加global,结果为 15, 12

描述:
   global() 后面的name是一个指针,一个内存地址,直接调用的那个内存地址.调用之后在局部变量里面再次给name赋值的话就修改了全局变量name
27.请写出打印结果
例1:
def func(a, b=[]):
   b.append(a)      # 对于默认参数来说,[]只定义了一次.
   print(b)

func(1)        # [1]
func(1)        # [1, 1]
func(1)        # [1, 1, 1]
func(1)        # [1, 1, 1, 1]

例2:
def func(a, b={}):
   b[a] = 'v'
   print(b)
   
func(1)        # {1: 'v'}
func(2)        # {1: 'v', 2: 'v'}

可变数据类型:value值改变, id值不变
28.求结果: lambda
def num():
   return [lambda x: i * x for i in range(4)]  # 返回值是一个列表
print([m(2) for m in num()])

答案: [6, 6, 6, 6]

拆分:
[lambda x: i * x for i in range(4)]
l = []
for i in range(4):
   func = lambda x:i*x  # [lambda x:i*x,lambda x:i*x,lambda x:i*x,lambda x:i*x]
   l.append(i)
   return l

l1 = []                  # i的值被覆盖,调用的时候i=3
for m in num():          # 2*3 = 6
   ret = m(2)
   l1.append(ret)
   
把列表改成()是生成器表达是 i不动 结果是0246 惰性机制 不调就不用
29.简述yield 和 yield from 关键字
yield:
yield用于生成器函数中替代 return 返回结果。迭代一次遇到yield时就返回yield后面的值。下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。

一个带有 yield 的函数就是一个生成器,它和普通函数不同,生成一个 生成器看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

参考网址:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

yield from:
yield from 是在Python3中出现的语法。
yield from 后面需要加的是可迭代对象, (迭代器,生成器)
yield from后面加上可迭代对象,他可以把可迭代对象里的每个元素一个一个的yield出来.

参考网址: https://www.cnblogs.com/wongbingming/p/9085268.html

示例:
def func():
   for c in 'AB':
       yield c
   for i in range(3):
       yield i
print(list(func()))    # ['A', 'B', 0, 1, 2]

def func():
   yield from 'AB'
   yield from range(3)
print(list(func()))   # ['A', 'B', 0, 1, 2]
30.有processFunc变量, 初始化为 processFunc=collapse and (lambda s:"".join(s.split())) or (lambda s:s)
1.
collapse = True
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print processFunc("i\tam\ntest\tobject !")
答案:i am test object !

2.
collapse = False
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
print processFunc("i\tam\ntest\tobject !")
答案:
i am
test object !

解答:
\t = tab键 = 4个空格    \n = 回车换行
1.当collapse=True时, processFunc=lambda s: " ".join(s.split()) or (lambda s: s)
processFunc=lambda s: " ".join(s.split())  # i am test object !

2.当collapse=False, processFunc=lambda s:s
31,请给出下面代码的输出结果
 a = 1
print(id(a))
def func(a):
    a = 2
    print(id(a))         #局部变量和全局变量的地址不相同
func(a)
print(a)                 # 1 对于a变量 在函数中定义了a=2 在函数执行完之后就销毁了 此时打印的a以旧是全局变量的a
a = []
def func(a):
    a.append(1)
func(a)
print(a)                    #[1]   对于列表a 将a传入了函数中为a增加了一个数值 a的地址不变
#可变数据类型与不可变数据类型
32.全局变量和局部变量的区别 如何给function里面的一个全局变量赋值
本质区别:作用域不同
全部变量实在整个py文件中声明的 全局范围可以访问
局部变量在某个函数中声明 只能在该函数中调用他 如果试图在超出范围的地方调用 程序就会报错
使用global来修改全局变量
a = 1
print(id(a))
def func():
    global a
    a = 2
    print(id(a))
func()
print(a)
a = []
def func(a):
    a.append(1)
func(a)
print(a)
33什么是lambda函数 下面代码的输出是什么
 lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的匿名函数
num = range(2,20)
for i in num:
    num =list(filter(lambda x:x==i or x%i ,num))
print(num)
   
 # 答案:[2, 3, 5, 7, 11, 13, 17, 19]


num = range(2,20)
for i in num:
    num =filter(lambda x:x==i or x%i ,num)
print(list(num))

#[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
34 指出下列程序存在的问题
a = 'adsad dada \dasdas'
def func(s,i):
请返回传入src使用空格或者\切分的倒数第i个字符串
    return s.split("\")[-index]   #斜杠转义 并且空格没有切分
def func(s,m):
    f = s.split('\\')
    l = []
    print(f)
    for i in f:
        print(i)
        i = i.split()
        l = l+i
    return l[-m]
print(func(a,1))
35.有一个数组[3,4,1,2,5,6,6,5,4,3,3]请写一个函数找出该数组中没有重复的数的总和 上面数据的没有重复的总和为1+2=3
 list1=[3,4,1,2,5,6,6,5,4,3,3]
def func(l):
    s = set(l)
    print(s)
    sum = 0
    for i in s:
      if l.count(i)<2:
            sum = sum+i
    return sum
print(func(list1))
36.求打印结果 (报错,未传参)
 arr =[1,2,3]
def bar():
    arr+=5
bar()
print(arr)
未传参
37请写出一个函数 计算出如下几个字母代表的数字
 AB -CD = EF
EF +GH = PPP
sos = 'AB -CD = EF, EF +GH = PPP'.replace(' ','')
num = [i for i in range(10)]
print(sos.split(','))
for a in sos.split(','):
    print(a.split('='))


el = 'AB-CD=EF EF+GH=PPP'
el = el.replace('=','==').replace(' ', ' and ')
print(el)
vs = list(set([s for s in el if s>='A' and s<='Z']))#筛选字母
print(vs)
num = [s for s in range(1,10)]
def fs(el, vs, num):
    if not vs:
        if eval(el):
            print(el.replace('and ', '').replace('==', '='))
    else:
        v = vs[0]
        ix = len(num)
        while ix:
            ix -= 1
            nel = el.replace(v, str(num[ix]))
            print(nel)
          fs(nel, vs[1:], num[0:ix]+num[ix+1:])
fs (el,vs,num)
38,给出下面代码片段的输出
 def say_hi(func):
    def wrapper(*args,**kwargs):
        print('HI')
        ret = func(*args,**kwargs)
        print('BYE')
        return ret
    return wrapper

def say_yo(func):
    def wrapper(*args,**kwargs):
        print('YO')
        return func(*args,**kwargs)
    return wrapper

@say_hi
@say_yo
def func():
    print('rock&roll')
func()
结果
HI
YO
rock&roll
BYE
39.简述标准库中functools.wraps的作用
https://www.cnblogs.com/fcyworld/p/6239951.html
定义一个最简单的装饰器
def user_login_data(f):
    def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
    return wrapper
def user_login_data1(f):
    def wrapper1(*args, **kwargs):
        return f(*args, **kwargs)
   return wrapper1
用装饰器装饰以下两个函数
@user_login_data
@user_login_data1
def num1():
    print("aaa")
@user_login_data
@user_login_data1
def num2():
    print("bbbb")
print(num1.__name__)
print(num2.__name__)
40请给出下面代码片段的输出
 def test():
    try:
        raise ValueError('something wrong')  #制造一个错误
    except ValueError as e:   #出现错误执行这个代码
        print('Error occurred')
       return
    finally:   #无论出不出错最后都执行这个代码
        print('Done')
test()
Error occurred
Done
41下面的函数 那些会输出1,2,3三个数字
for i in range(3):
    print(1)     #错
alist = [0,1,2]
for i in alist:
    print(i+1)    # 对
i = 1
while i<3:
    print(i)   #错
    i+=1
for i in range(3):
    print(i+1)    #对
42以下函数需要在其中引用一个全局变量k请填写语句
k = 1
def func():
    global k
    #nonlocal   使用上一级的变量
    k = k+1
func()
print(k)
43 请把以下函数转化为python lambda匿名函数
def add(x,y):
    return x+y
p = lambda x,y:x+y
print(p(1,2))
44,阅读以下代码 并写出程序的输出结果
my_dict ={'a':0,'b':1}
def func(d):
    d['a'] = 1
    return d
func(my_dict)
my_dict['c'] = 2
print(my_dict)
{'a': 1, 'b': 1, 'c': 2} 字典是可变数据类型
45填空题
#有函数定义如下
def calc(a,b,c,d=1,e=2):
   return (a+b)*(c-d)+e
#请分别写出以下标号代码的输出结果 如果出错请写出Error
print(calc(1,2,3,4,5))     #(1+2)*(3-4)+2   2
print(calc(1,2,3))         #8
# print(calc(1,2))#出错
print(calc(1,2,3,e=4))    #10
print(calc(e=4,c=5,a=2,b=3))  #   (2+3)*(5-1)+4         24
# print(calc(1,2,3,d=5,4))#出错
46.def func(a,b=[])这种写法有什么陷阱?
默认参数陷阱:当多次调用func函数而没有指定b的具体值时,每次func函数都会使用相同地址的列表
47.函数
def add_end(l=[]):
   l.append("end")
   return l

add_end() # 什么都不输出
add_end() # 什么都不输出
48.函数参数*args,**kwargs的作用是什么?
def func(a,b,c=0,*args,**kwargs):
   pass

# *args 接收多个位置参数 打包成元祖
# **kwargs 接收多个关键字参数 打包成字典
49.可变参数定义*args,**kwargs的区别是什么?并且写出下边代码的输入内容
def foo(*args, **kwargs):
   print("args=", args)
   print("kwargs=", kwargs)
   print("-----------------------")


if __name__ == '__main__':
   foo(1, 2, 3, 4)     # args=(1, 2, 3, 4) kwargs={}
   foo(a=1, b=2, c=3)    # args=() kwargs={a:1,b:2,c:3}
   foo(1, 2, 3, 4, a=1, b=2, c=3)    # args=(1, 2, 3, 4) kwargs={a:1,b:2,c:3}
   foo("a", 1, None, a=1, b="2", c=3)    # args=("a", 1, None) kwargs={a:1,b:"2",c:3}
50.请写出log实现(主要功能是打印函数名)
@log
def now():
   print("2013-12-25")
now()

输出:
call now()
2013-12-25


实现:
def log(func):
   def inner():
       print(f"call {func.__name__}()")
       func()
   return inner
51.python如何定义一个函数
A. class <name>(<Type> arg1, <Type> arg2, ...)
B. function <name>(arg1, arg2, ...)
C. def <name>(arg1, arg2, ...)
D. def <name>(<Type> arg1, <Type> arg2, ...)

答案:C
52.选择代码运行结果
country_counter = {}
def addone(country):
   if country in country_counter:
       country_counter[country] += 1
   else:
       country_counter[country] = 1

addone("China")
addone("Japan")
addone("china")
print(len(country_counter))

答案:3
53.选择输出结果
def doff(arg1, *args):
   print(type(args))

doff("apple","banana","cherry")

答案:tuple
54.下面程序的输出结果是
d = lambda p: p * 2
t = lambda p: p * 3

x = 2
x = d(x)
x = t(x)
x = d(x)
print(x)

答案:24
55.什么是lamdba表达式
匿名函数,不需要函数名,不能写复杂的逻辑的函数
格式: lambda 参数: 返回值表达式
56.以下代码的输出结果是什么,请给出答案并解释
def multipliers():
   return [lambda x: x*i for i in range(4)]

print([m(2) for m in multipliers()])
[6, 6, 6, 6]
57.有0<x<=10,10<x<=20...190<x<=200,200<x这样的21个区间分别对应1-21二十一个级别,请编写一个函数level(x)根据输入数值返回对应级别
from math import ceil
def level(x):
   if x > 200:
       print("level 21")
   else:
       print(f"level {ceil(x/10)}")
58.写函数。有一个数据结构如下所示,请编写一个函数从该结构数据中返回由指定的字母和对应的值组成的字典。如果指定字段不存在,则跳过该字段
------------------------------------------------------
data:{"time":"2016-08-05T13:13:05",
"some_id":"ID1234",
"grp1":{"fld1":1,"fld2":2},
"xxx2":{"fld3":0,
   "test":{‘fld5’:0.4}},"fld6":11,"fld7":7,"fld46":8 }
   
fields:"|"连接的以"fld"开头的字符串,如:fld2|fld3|fld7|fld19  
def select(data,fields):              
   return result
-------------------------------------------------------
# # 版本一
def select(data,fields):
   # TODO:implementation
   fld_lst = fields.strip().split("|")
   def inner(fld_lst, data, res_lst={}):
       for i in data:
           if isinstance(data[i], dict):
               tem_lst = inner(fld_lst, data[i], res_lst)
               for i in tem_lst:
                   res_lst[i] = tem_lst[i]
           else:
               if i in fld_lst:
                   res_lst[i] = data[i]
       return res_lst
   result = inner(fld_lst, data)
   return result

#版本二
def select(data,fields):
   # TODO:implementation
   fld_lst = fields.strip().split("|")
   def inner(fld_lst, data, res_lst={}):
       for i in data:
           if i in fld_lst:
               res_lst[i] = data[i]
           if isinstance(data[i], dict):
               tem_lst = inner(fld_lst, data[i], res_lst)
               for i in tem_lst:
                   res_lst[i] = tem_lst[i]
       return res_lst
   result = inner(fld_lst, data)
   return result

 

 

转载于:https://www.cnblogs.com/Xiao_Xu/p/11080049.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值