python基础面试集锦(1-50)

目录

1、Python和Java、PHP、C、C#、C++等其他语言的对比

'''
1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
      C语言的优点:简洁紧凑、灵活方便;运算符丰富;数据类型丰富;表达方式灵活实用;允许直接访问物理地址,对硬件进行操作;生成目标代码质量高,程序执行效率高;可移植性好;表达力强;
      C语言的缺点:C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。

 

2.C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。
生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。该过程实际上分成两个步骤。
第一步是对程序进行编译,这需要用到编译器(compiler)。编译器将C++语句转换成机器码(也称为目标码);如果这个步骤成功,下一步就是对程序进行链接,这需要用到链接器(linker)。链接器将编译获得机器码与C++库中的代码进行合并。C++库包含了执行某些常见任务的函数(“函数”是子程序的另一种称呼)。例如,一个C++库中包含标准的平方根函数sqrt,所以不必亲自计算平方根。C++库中还包含一些子程序,它们把数据发送到显示器,并知道如何读写硬盘上的数据文件。 
 
 3. C#语言,C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。首先,C# 和JAVA一样,简直就是照搬了C++的部分语法,因此,对于数量众多的C++程序员学习起来很容易上手,另外,对于新手来说,比C++要简单一些。其次,Windows是占垄断地位的平台,而开发Windows应用,当然微软的声音是不能忽略的。最重要的是,相对于C++,用C# 开发应用软件可以大大缩短开发周期,同时可以利用原来除用户界面代码之外的C++代码。


4. Java语言,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
Java的优势,与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。


5.php语言,PHP(PHP: Hypertext Preprocessor的缩写,中文名:“PHP:超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。
     特性:PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法;PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多,PHP具有非常强大的功能,所有的CGI的功能PHP都能实现; PHP支持几乎所有流行的数据库以及操作系统;最重要的是PHP可以用C、C++进行程序的扩展。


6.python语言,是一种面向对象、直译式计算机程序设计语言,Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。
'''

2、简述解释型语言和编译性语言?

- 编译型(需要编译器,相当于用谷歌翻译):编译型语言执行速度快,不依赖语言环境运行,跨平台差,如C,C++执行速度快,调试麻烦

- 解释型(需要解释器,相当于同声传译):解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行,如python,JAVA执行速度慢,调试方便

3、Python解释器种类以及特点?

'''
## CPython

CPython是使用最广且被的Python解释器。本教程以CPython为准。当我们从Python官方网站下载并安装好Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。

## IPython

IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。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的字节码。
'''

4 、位和字节的关系?

8 bit = 1bytes

5、b、B、KB、MB、GB的关系?

bit就是位,也叫比特位,是计算机表示数据最小的单位
byte就是字节
1byte=8bit=1B
'''
8bit = 1B
1024B = 1KB
1024KB = 1MB
1024MB = 1GB
'''

6、一个字符不同编码对应的字节数?

ASCII码:一个英文(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
UTF-8编码:一个英文(不分大小写)占一个字节的空间,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节

7、PEP8编码规范?

1、每个缩进层级使用4个空格。
2、每行最多79个字符。
3、顶层的函数(def)或类(class)的定义之间空两行。
4、采用ASCII或UTF-8编码文件。(就是在里面表明编码格式,ASCII编码格式或者是UTF-8的编码格式)
5、在文件的顶端,注释和文档说明之下,每行每条import语句只导入一个模块,
同时要按标准库、第三方库和本地库的导入顺序进行分组。(标准库是下载python后就有的,也就是python自带的,要是需要下载,无论是pip还是其他,都是第三方库。而本地库就是自己创建的)
6、在小括号、中括号、大括号之间或者括号之前没有额外的空格
7、类(class)的命名采用驼峰命名法,如CamelCase;异常的定义使用Error前缀(如适用的话);函数的命名采用下划线分隔的小写字母,如separateed_by_underscores;用下划线开头定义私有的属性或方法,如_private

8、or and 计算规则

1. 在纯and语句中,如果每一个表达式都不是假的话,那么返回最后一个,因为需要一直匹配直到最后一个。如果有一个是假,那么返回假
2. 在纯or语句中,只要有一个表达式不是假的话,那么就返回这个表达式的值。只有所有都是假,才返回假
3. 在or和and语句比较难表达,总而言之,碰到and就往后匹配,碰到or如果or左边的为真,那么就返回or左边的那个值,如果or左边为假,继续匹配or右边的参数。

9、求结果:or and

'''
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
>>>1 3 0 1 1 False
'''

10、ASCII、unicode、utf-8、gbk区别?

'''
ascii:
在计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit),有0和1两种状态,因此,8个二进制位可以组合出256种状态,这被称为字节(byte)。上个世纪60年代,美国制定了一套字符编码,对英文字符与二进制之间做了联系,这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符,比如SPACE是32,A是65,这128个符号只咱用了一个字节的后面七位,最前面的一位统一规定为0。


unicode:
世界上有多种编码方法,同一个二进制数字可以被解释称不同的符号。因此,在打开一个文本文件时候,就必须知道它的编码方式,用错误的编码方式打开,就会出现乱码。
Unicode编码,这是一种所有符号的编码。
Unicode显然是一个巨大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如U+0041表示英语的大写字母A,U+4e25表示汉字严。
在Unicode庞大的字符集的优势下,还存在一个问题,比如一个汉字,“严”的Unicode是十六进制4e25,转成二进制足足有15位,也就是,这个符号需要2个字节,表示其他字符还存在3个字节或者更多。计算机怎么区别三个字节表示的是同一个符号而不是分开表示三个呢?如果Unicode统一规定,每个符号用3个字节表示,但是某些字母显然不需要3个,那么就浪费了空间,文本文件大小超出了很多,这显然是不合理的。直到UTF8字符编码出现了。


utf-8:
UTF8的最大特点是,它是一种变长编码,可以使用1-4个字节表示一个符号,根据不同的符号来变化字节长度。
UTF8编码规则只有两条:
1)对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unicode码。因此,对于英文字母,UTF8编码和ASCII编码是相同的。
2)对于非单字节(假设字节长度为N)的符号,第一个字节的前N位都设为1,第N+1设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制,全部为这个符号的Unicode码。


gbk:
GBK编码是对GB2312的扩展,完全兼容GB2312。采用双字节编码方案,剔出xx7F码位,共23940个码位,共收录汉字和图形符号21886个,GBK编码方案于1995年12月15日发布。它几乎完美支持汉字,因此经常会遇见GBK与Unicode的转换。

1,各个编码之间的二进制,是不能互相识别的,会产生乱码。
2,文件的存储,传输,不能是unicode (只能是utf-8 utf-16 gbk gbk2312 ascii等)
'''

11、字节码和机器编码的区别?

机器码:CPU直接读取运行的机器码,运行速度最快,但是非常晦涩难懂,同时也比较难编写;
        机器码就是计算机可以直接执行,并且执行速度最快的代码;
编译码:字节码是一种中间状态的(中间码)的二进制代码(文件),字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。

总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

12、三元运算编写格式?

'''
        条件成立 if 条件 else 条件不成立
'''
值(1) if 条件 else 值(2)
条件成立 值(1)
条件不成立 值(2)
三元表达式只推荐两种选择的情况下(是或非)

13、Python2和Python3的区别?

'''
# py2
>>> print("hello", "world")
('hello', 'world')
# py3
>>> print("hello", "world")
hello world

py2:input_raw()
py3:input()

1/2的结果
py2:返回0
py3:返回0.5

py2:默认编码ascii
py3:默认编码utf-8

字符串
py2:unicode类型表示字符串序列,str类型表示字节序列
py3::str类型表示字符串序列,byte类型表示字节序列

py2中函数用关键字global声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的。
py3中,新增了关键字nonlocal,使得非局部变量成为可能

py2:经典类和新式类之分,继承了obj的是新式,否则位经典
py3:默认全部继承了obj,全是都是新式类
'''

14、一行代码数值交换?交叉赋值

'''
a = 1
b = 2
------------------
a,b = b,a
'''

15、python2和python3中Int和long的区别?

'''
python2:
  int() # 整型
  long() # 长整型
  
python3中没有long类型,只有int类型
'''

16、xrange和range的区别?

'''
        xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。__ither__,__next__

注意:现在的python3中将以前的range取消了,而将xrange重新命名成了range!所以我们现在看到的range其实本质还是xrange~。
'''

17、字符串的反转序列?步长-1切

'''
name="张全蛋"
name[::-1]
> '蛋全张'
'''

18、文件操作时:xreadlines和readlines的区别?

'''
readlines()是把文件的全部内容读到内存,并解析成一个list,当文件的体积很大的时候,需要占用很多内存
xreadlines()则直接返回一个iter(file)迭代器,在Python 2.3之后已经不推荐这种表示方法了.直接使用for循环迭代文件对象
'''

19、列举布尔值位false的常见值?

'''
0, [] , () , {} , '' , False , None
'''

20、is和==的区别?

'''
is比较的是id
== 比较的是值
'''

21、那些情况下,y!=x-(x-y)会成立?

'''
x,y是两个不相等的非空集合
'''

22、现有字典dict = {‘a‘:20,‘b‘:25,‘c‘:10,‘d‘:50}请按字典中的value值进行排序?

# 第一种:lambda方法
dict = {'a':20,'b':25,'c':10,'d':50}
a = sorted(dict.items(),key=lambda x:x[1])
print(a)
# 结果:
[('c', 10), ('a', 20), ('b', 25), ('d', 50)]

# 第二种方法:zip拉链+sorted
d1 = {'a':20,'b':25,'c':10,'d':50}
d2 = zip(d1.values(),d1.keys())  # 拉链
kk = sorted(d2)
print(kk)
# [(10, 'c'), (20, 'a'), (25, 'b'), (50, 'd')]

23、如何将字典的键值互换?

# 第一种:遍历字典的键值,重新造一个字典赋值
dict = {'a':20,'b':25,'c':10,'d':50}
dict1 = {}
for key,value in dict.items():
    dict1[value]=key
print(dict1)
# 结果:{20: 'a', 25: 'b', 10: 'c', 50: 'd'}

# 第二种:利用拉链zip,值放在前面,键放在后面拉
d1 = {'a':20,'b':25,'c':10,'d':50}
d2 = dict(zip(d1.values(),d1.keys()))
print(d2)
# 结果:
{20: 'a', 25: 'b', 10: 'c', 50: 'd'}

24、字典和json的区别?

'''
  字典是一种数据结构,json是一种数据的表现形式,字典的key值只要是能hash的就行,json的必须是字符串。
'''
可hash:不可变的数据结构,字符串、元组、对象objects
不可hash:可变的数据结构,字典、列表、集合,他们在改变值的同时却没有改变id,无法由地址定位值的唯一性,因而无法哈希。

25、什么是可变、不可变类型?

'''
   可变不可变指的是内存中的值是否可以被改变,不可变类型指的是对象所在内存块里面的值不可以改变,有数字、字符串、元组;可变类型则是可以改变,主要有列表、字典。
'''

26、存入字典里的数据有没有先后排序?

'''
   存入的数据不会自动排序,可以使用sort函数对字典进行排序。当字典量小的时候体现不出无序,量大才能体现出字典无序
'''
OrderedDict有序字典

27、字典推导式?

m2 = ['jeff', '123', '18', '男']
d = {i: j for i, j in enumerate(m2)}
print(d)

python基础面试集锦(1-50)

28、描述一下dict的item()方法与iteritems()的不同?

字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。

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

"""
在Python2.x中,iteritems() 用于返回本身字典列表操作后的迭代器【Returns an iterator on all items(key/value pairs) 】,不占用额外的内存。

在Python 3.x 里面,iteritems()方法已经废除了。在3.x里用 items()替换iteritems() ,可以用于 for 来循环遍历。
"""

29、反转字符串?步长-1切割

a = '123456'
print(a[::-1])
# 654321

30、请按list种元素age有大到小排序?

list1 = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
list2 = sorted(list1,key=lambda x:x['age'],reverse=True)
print(list2)
# [{'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}, {'name': 'a', 'age': 20}]

31、列举常见的字符串格式化?

'''
name = '张三'

1)占位符
s1 = "%s DSB 你好"%name

2)format
s2 = '{} DSB 你好'.format(name)

3)f-string(python3.6之后才有的特性)
s3 = f'{name} DSB 你好'
'''

32、简述字符串驻留机制?

'''
对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副 
本。长字符串不遵守驻留机制。

驻留适用范围: 由数字,字符和下划线(_)组成的python标识符以及整数[-5,256]。 
'''

33、输出结果?

list = ['a', 'b', 'c', 'd', 'e']
print(list[10:])

'''
下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index

来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。
'''

34、用列表生成式,产生一个公差为9的等差数列?

print([i*9 for i in range(10)])
# [0, 9, 18, 27, 36, 45, 54, 63, 72, 81]

35、给定两个列表,怎么找出相同元素,不同元素?用集合set

list1 = [1,2,3]
list2 = [3,4,5]
set1 = set(list1)
set2 = set(list2)
print(set1&set2) # {3}
print(set1^set2) # {1, 2, 4, 5}

36、实现删除一个list中的重复元素?用集合set

# 第一种:结果无序
list1 = ['a','b','c','a','b','c']
list2 = set(list1)
print(list2)  # ['c', 'a', 'b'] 无序的

# 第二种:按原来的顺序
list1 = ['a','b','c','a','b','c']
list2 = list(set(list1))
list2.sort(key=list1.index)
print(list2)  # ['a', 'b', 'c']

# 第三种:用遍历
list1 = ['a','b','c','a','b','c']
list2 = []

for i in list1:
    if not i in list2:
        list2.append(i)
print(list2)

37、对列表进行无关排序?

l1 = ['This','is','a','Boy','!']
print(sorted(l1))
# ['!', 'Boy', 'This', 'a', 'is']

38、列表、字符串、元组、字典常用的方法?

字符串:repleace替换,strip去空(首位),split(切割),reverse逆序,upper转大写,lower转小写,join连接字符串.....

列表:append添加,pop删除,insert插入,remove删除,sort排序,count计数,index拿索引.....

元组:index索引,count计数,len()长度,dir()

字典:get取值,keys键,values值,pop删除,popitems,clear清空,update连接,items键值对.....

39、什么是反射?以及应用场景?

在绝大多数语言当中都有反射机制的存在, 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python中一切皆对象,都可以使用反射

反射使用场景:
?   1.反射就是对属性的增删改查,但是如果直接使用内置的 dict来操作,语法繁琐,不好理解
?   2.如果对象是别人提供的,判断这个对象是否满足要求

hasattr(p,'name'):查找p对象中是否存在name属性
getattr(p,'name'):取值,p对象中name属性
setattr(p,'name','jeff'):添加,为p对象中添加name属性jeff
delattr(p,'name'):删除,删除p对象中name属性

40、简述python的深浅拷贝?

copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据

deepcopy():深copy,深拷贝指拷贝数据集合的所有层

41、python垃圾回收机制?

垃圾回收机制是自动帮助我们管理内存,清理垃圾的一种工具

1)、引用计数
当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1;
当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。

优点:
简单、直观
实时性,只要没有了引用就释放资源。

缺点:
维护引用计数需要消耗一定的资源
循环应用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制。

2)、标记-清除
“标记-清除”不改动真实的引用计数,而是将
集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副
本做任何的改动,都不会影响到对象生命走起的维护。

3)、分代回收
将系统中的所有内存块根据其存活时间划分为不同的集合,
每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。
也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

42、python中,那个语句能直接显示的释放内存资源?

import gc

gc.collect()

43、lambda表达式格式以及应用场景?

'''
匿名就是没有名字
def func(x,y,z=1):
    return x+y+z

匿名
lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
func=lambda x,y,z=1:x+y+z   # 匿名函数有名,则无意义
func(1,2,3)
'''

44、获取python解释器版本的方法?

import sys
print(sys.version)
# 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]

45、*args和**kwargs作用?

*args用来接收溢出的位置参数,将接收的参数组织成元组
**kwargs用来接收溢出的关键字参数,将接受的参数组织成字典

46、一行代码实现9*9乘法表?

print('\n'.join(['\t'.join(["%s*%s=%s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

# 递归
def f(i):
     if i>=1:
        f(i-1)
        print(['%dx%d=%d'%(j,i,i*j) for j in range(1,i+1)])
        
if __name__=='__main__':
    f(9)
    
['1x1=1']
['1x2=2', '2x2=4']
['1x3=3', '2x3=6', '3x3=9']
['1x4=4', '2x4=8', '3x4=12', '4x4=16']
['1x5=5', '2x5=10', '3x5=15', '4x5=20', '5x5=25']
['1x6=6', '2x6=12', '3x6=18', '4x6=24', '5x6=30', '6x6=36']
['1x7=7', '2x7=14', '3x7=21', '4x7=28', '5x7=35', '6x7=42', '7x7=49']
['1x8=8', '2x8=16', '3x8=24', '4x8=32', '5x8=40', '6x8=48', '7x8=56', '8x8=64']
['1x9=9', '2x9=18', '3x9=27', '4x9=36', '5x9=45', '6x9=54', '7x9=63', '8x9=72', '9x9=81']

47、比较a = [1,2,3]和b=[(1),(2),(3)]以及c=[(1,),(2,),(3,)]的区别?

a与b两者值相等,而c张列表的每一个元素是一个个的元组的形式
a,b元素均数字,b中括号内没有加逗号,所以仍然是数字

48、1<(2==2)和1<2==2的结果分别是什么?

print(1 < (2 == 2))  --> False
print(1 < 2 == 2)  --> True

49、如何打乱一个排序好的列表?

import random
random.shuffle(alist)

res = [1, 2, 3, 4, 5]
random.shuffle(res)  # 打乱列表的顺序
print(res)  # [3, 1, 4, 5, 2]  每一次都是随机顺序

50、如何让查找一个字符串中特定的字符?find和index的差异?

1)、find()方法:查找子字符串,若找到返回从0开始的下标值,若找不到返回-1
2)、index()方法:在字符串里查找子串第一次出现的位置,类似字符串的find方法,不过比find方法更好的是,如果查找不到子串,会抛出异常,而不是返回-1
3)、rfind和rindex方法用法和上面一样,只是从字符串的末尾开始查找