python复习

python复习

一、Python基础笔试题

1、什么是变量?

  • 1.1 什么是变量:

变量是一种类似"容器"的逻辑概念,用来存储值,比如定义一个整型变量 ,那么这个变量存储的是整数类型的值。那么,为什么变量可以存储值呢?因为变量对应的是一段内存空间,变量存储值,是指将值存储在变量所对应的内存空间中。

  • 1.2 python中的变量:

我们通常使用的Python是CPython, CPython中的变量是一个存储内存地址的容器,将值或变量赋值给其它变量,是指将值的内存地址或变量存储的内存地址,再拷贝到其它变量中。分析下面的代码,加深对Python变量的理解:

# 定义变量number,指向的值为1
number = 1
# 在CPython中,通过id来获取数据对象的内存地址
if id(1) == id(number):
	print("值1的内存地址与变量number存储的内存地址相等")

2、 python和CPython是什么关系?

首先得理解Python是一种解释型的编程语言。一类编程语言有其特定的语法规则 ,数据类型,控制结构。我们按照编程语言的语法规范来编写代码,但是这些代码不能被计算机识别。

为了让编写的代码可以被计算机识别并运行,需要借助一种"翻译器",该翻译器将我们编写的代码翻译成可以被计算机执行的机器指令。

在计算机中有两种类型的"翻译器",一种翻译器直接将代码转译成机器指令,这种翻译器叫做编译器。另一种翻译器需要先将代码翻译成中间代码,然后再对中间代码逐条的解释执行,这种翻译器叫做解释器。

所谓的解释执行,就是将中间代码再转译成机器指令,然后再执行。

Python之所以是解释型的编程语言,是因为它是通过解释器来解释执行的。而CPython就是这样的一种解释器,这种解释器是用另外一种编程语言-C语言实现的解释器 。我们通常使用的Python,如果没有特殊说明,指的都是CPython。

Python的解释器实现中,除了CPython,还有Jython等其它解释器, Jython是使用java编程语言实现的Python解释器。

3、 如何生成一个整数序列?

Python提供了一个内置的range类型,可以用来生成整数序列。range类型基本用法:

range(start, stop[, step])

参数start与参数stop用来构造整数序列的一个左闭右开区间**[start, stop),**表示整数序列从start开始,但不包括stop。假设start的值为0, stop的值为5,那么该左闭右开区间为[0, 5), range(0, 5)对应的整数序列为:

0,1,2,3,4

step是可选的参数,所谓可选参数,即可传或可不传,用来表示相邻数字间的步长,比如步长为2,那么起始数字为0,下一个数字就为0+2,也就是2,以此类推。继续以左闭右开区间[0, 5)为例,假设步长为2,则range(0, 5, 2)对应的整数序列为:

0, 0+2, 0+2+2

在只给range类型传递一个参数时,构造的是从0到该参数的一个正向区间。例如传递参数值5时,构造的正向区间为[0, 5),传递的参数值小于等于0时,不会生成任何整数。给range类型传递的步长为负数时,可以生成一个降序排序的整数序列,此时start的值必须大于stop的值。

对于range类型生成的整数序列,可以在for循环中进行遍历:
Python

for number in range(5, 0, -1):
  print(number)

4、表达式与语句的主要区别是什么?

语句"在计算机编程语言中,表示"程序"的一个指令执行过程。比如if语句,根据条件表达式的值,来判断是否执行相应的操作。for语句,遍历表达式列表中的所有元素。一个程序至少由一个语句构成,计算机程序的本质是让计算机执行某种指令。

而"表达式"代表对计算过程的一种描述,通常有输出。比如算数表达式,描述的是一个算数运算,输出为算数运算后的结果。表达式不能执行,但语句一定会执行。我们可以说计算一个表达式的值,执行一个语句,但不会说**"执行一个表达式,计算一个语句 "** 。

编程语言中的语句需要借助表达式的值,来执行相应的计算逻辑。分析下面的赋值语句,加深对语句和表达式的理解:

Python

love = 201314

201314表达的是一个整数,它是一个表达式。Python解释器在解析到赋值运算符"="时,会计算赋值运算符右边的表达式,然后将表达式的值赋值给运算符左边的变量。

CPython中的赋值过程,执行的操作为将值的内存地址赋值给变量。

更典型的是if语句,根据条件表达式的值,来判断是否执行相应的操作:

Python

# 逝去的爱

love = 201314

# 判断对你的爱,是否一生一世
if love >= 201314:
    print("love forever")
else:
    print("the lost love")

5、 Python的基础数据类型有哪些?

Python的基础数据类型,可分为简单数据类型和复合数据类型。简单数据类型是不可再分割的原子数据类型,Python中的简单数据类型有:整型,浮点类型,布尔类型。复合数据类型由简单数据类型或其它复合数据类型组合而成,是一种可以存储其它数据类型的数据集合,在Python中也被成为容器类数据类型。Python中的复合数据类型有:字符串,列表,元组,字典,集合

通过内置的type,可以输出数据类型的类型名:

Python

# 在type的输出中,class后面用引号括住的即为数据类型的类型名
class_name = type(2020)
# class_name的输出为<class 'int'>,int即为整型的类型名

class_name = type(20.1314)
# class_name的输出为<class 'float'>,float即为浮点类型的类型名

class_name = type(True)
# class_name的输出为<class 'bool'>,bool即为布尔类型的类型名

class_name = type('Python')
# class_name的输出为<class 'str'>,str即为字符串类型的类型名

class_name = type([1,2,3])
# class_name的输出为<class 'list'>,list即为列表类型的类型名
 
class_name = type((1,2,3))
# class_name的输出为<class 'tuple'>,tuple即为元组类型的类型名

class_name = type({0: 'ok', 1: 'invalid parameters'})
# class_name的输出为<class 'dict'>,dict即为字典类型的类型名

class_name = type({'Python', 'C++', 'Java'})
# class_name的输出为<class 'set'>,set即为集合类型的类型名

6、在Python中如何进行代码缩进?

如何进行代码缩进?

首先理解什么是代码缩进。编程语言中的代码缩进是指调整代码与父级边缘的水平距离,这个距离用空格数来进行度量。例如缩进四个空格,指的是与父级边缘水平相距四个空格。例如下面包含缩进的代码:

# 与父级边缘水平相距0个空格

Python

number=1
if number > 0:
    # 与父级边缘水平相距四个空格, print函数与上文的if语句是子级和父级的关系
    print(number)

Python中的代码缩进规则:

(1) 全局对象或语句块中的首行没有缩进,必须顶格

(2) 同层次的语句须包含相同缩进的空格数

(3) 子级层次的语句与父级层次的语句必须有缩进

(4) 单行注释可以随意缩进,多行注释与同层次的代码保持相同的缩进

现在通过一则实例来讲解Python中的代码缩进规则:

Python

# state是一个全局变量,与首行没有缩进,必须顶格
state = 0
# if语句块的首行没有缩进,必须顶格
if state == 0:
    """
    (1) 冒号下方的代码属于子级层次,必须有缩进
    (2) 多行注释与同层次的代码保持相同的缩进
    """   
    print("开心")
    
# else语句块的首行没有缩进,必须顶格
else:
    # 冒号下方的代码属于子级层次,必须有缩进
    # 与父级else语句所在的边缘水平相距四个空格
    print("不开心")
    
    # 与上面的print处于同一层级,必须包含相同缩进的空格数
    print("unhappy")

7、如何输出Python中的所有关键字?

首先理解什么是关键字。关键字也称保留字,其字面意思为保留给Python使用的特殊标识符。例如布尔值True就是一个关键字,表示逻辑值中的真值。Python中的关键字有其特殊用途,当我们使用关键字来进行命名时,会导致冲突,所以Python解释器在解析执行对关键字进行赋值的操作时,会抛出语法错误的异常信息。

输出当前Python版本的所有关键字,一共有两种方法,在交互模式中直接执行help(“keywords”):

>>> help(“keywords”)

Here is a list of the Python keywords. Enter any keyword to get more help.

False class from or

None continue global pass

True def if raise

and del import return

as elif in try

assert else is while

async except lambda with

await finally nonlocal yield

break for not

直接访问keyword模块中的kwlist属性,输出的是一个列表,列表包含当前版本中的所有关键字:

Python

# 导入keyword模块
import keyword

# 判断True是否为一个关键字
if str(True) in keyword.kwlist:
    print("True 是一个关键字")

8、Python交互模式的主要用途有哪些?

Python交互模式的主要用途为代码调试,以及查找帮助信息。在交互模式中进行调试,比如快速验证模块是否安装成功,对函数的功能进行测试,等等。

9、python中的控制结构有哪些?

Python中的控制结构有:条件控制,循环控制,转向控制。使用if,elif,else语句来定义条件控制,使用for,while语句来定义循环控制,使用break, continue, return语句来定义转向控制。

条件控制的代码实例:

Python

x = 1
y = -1
if x+y > 0:
    # 在if语句中判断表达式值的真假,值为真,就执行冒号下面的代码 
    print("x+y > 0")
elif x+y == 0:
    # if语句中的条件不成立的情况下会继续判断elif语句中的条件是否成立
    print("x+y == 0")
else: 
    # 在if和elif语句的条件都不成立的情况下执行else语句中的代码
    print("x+y < 0")

循环控制的代码实例:

Python

for number in 1,2,3,4,5:
    print(number)
    # 如果当前number指向的值大于3,就执行break退出循环 
    if number > 3:
        break
    else:
        # 如果for循环非正常退出就不会执行else语句下面的代码
        print("for循环正常退出")

转向控制的代码实例:

Python

sum_of_numbers = 0
for number in range(2100):
    for _ in range(2, number)
        if number % _ == 0:
            # %是求余运算符,如果当前number与2的余数为0,那么就退出循环
            break 
    else:
        # 循环正常退出,说明当前number为质数
        sum_of_numbers = sum_of_numbers + _

10、什么是三元表达式?

三元表达式也称为三元运算。三元运算是软件编程中的一种固定格式,在Python中,通过if语句来实现三元运算。

三元运算的语法格式:

expression1 if expression else expression2

三元运算的执行逻辑为:如果if语句中的表达式的值为真,就返回表达式expression1的值,否则返回表达式expression2的值。使用三元运算在特定场景下可以简化if语句的使用。未使用三元运算符的代码实例:

Python

is_happy = True
if is_happy:
    feeling = "so happy"
else:
    feeling = "so unhappy"

使用三元运算的代码实例:

Python

is_happy = True
feeling = "so happy" if is_happy else "so unhappy"

这两则代码实例实现的是同样的效果,但使用三元运算的代码看起来更简洁。在条件分支比较多的情况下,不适合使用三元运算,读者需根据实际中的情况来进行使用。

使用三元运算来计算最大值:

Python

# 假设变量x,y,z已定义,变量指向的为整型值或浮点值
max = x if x > y else y
max = max if max > z else z

11、循环结构中的else语句是多余的吗?

循环控制结构中的else语句,它表达的是循环正常迭代的一种延续(收尾操作),如果循环被中断执行,那意味着打破了这种正常迭代的状态。比如遍历从1到100之间的所有自然数,在正常情况下,需要迭代100次。Python是一种简单,优雅的编程语言,在循环结构中设计这样一种else结构,可以让代码的逻辑结构更加清晰。以下为判断是否为合数的一段关键代码

Python

is_composite_number = True
for _ in range(2, 100):
    if number % _ == 0:
        # 如果余数为0,说明为合数,执行break退出循环
        break
else:
    # 循环正常退出,说明不为合数,逻辑很清晰  
    is_composite_number = False

如果没有这样的else结构,那么需要将记录状态的flag变量耦合到循环体中:

Python

is_composite_number = False
for _ in range(2, 100):
    if number % _ == 0:
        # 如果余数为0,说明为合数,执行break退出循环
        is_composite_number = True
        break

12、break与continue的区别是什么?

break语句与continue语句都只能用于循环结构。break语句用来终止循环,是循环的终结者,只要在循环结构中执行了break语句,就会退出当前的循环结构。而continue语句用来结束本次的代码执行。举个简单的例子,在一个循环结构中,会重复执行5次相同的代码。使用for循环执行5次的代码实例:

Python

value = 0

# 重复执行5次
for _ in range(5):
    value += _ + _

在for循环中加一个条件判断,如果value大于5,就执行break:

Python

value = 0

# 重复执行5次
for _ in range(5):
    if value > 5:
        # 执行break退出当前的for循环
        break
        
    value += _ + _

执行break以后,会退出当前的循环结构,而continue只会结束本次的代码执行:

Python

value = 0

# 重复执行5次
for _ in range(5):

    if _ % 2 == 0:
        # 如果为偶数,则执行continue, 结束本次的代码执行
        continue
        
    # 执行continue以后,不会再执行cotinue语句下面的代码,但会继续执行下一次循环
    value += _ + _

13、哪些值会转换为布尔类型中的False?

首先得理解布尔类型,布尔类型用来表示逻辑上的真或假,布尔类型适用于进行逻辑判断的应用场景。Python中的整型0值,浮点类型的0值,空字符串,空列表,空元祖,空字典,空集合等空类型,以及None类型,都会转换为布尔类型中的False值。

代码实例:

Python

# if语句下的print代码不会执行,if语句中的表达式会转换为False值
if 0 or 0.0 or "" or [] or () or {} or set():
    print("Nothing!")

14、如何理解Python中的None类型?

Python中的None对象是一个NoneType类型, 我们可以在交互模式中执行type(None)来输出None的类型名:

>>> type(None)

<class ‘NoneType’>

直接通过NoneType来构造一个None对象,会抛出了NameError的异常:

>>> none = NoneType()

Traceback (most recent call last):

File “”, line 1, in

NameError: name ‘NoneType’ is not defined

在Python的官方文档中查找资料可知,NoneType并没有在Python/C API中进行公开,所以使用NoneType时会抛出NoneType未定义的错误。Python中的None对象是一个单例,仅用来测试对象的标识值。单例对象在进程的生命周期中只存在一个唯一的实例。

CPython中的对象标识值即为内存地址

由于None对象是单例,所以None对象的标识值仅与None对象的标识值相等。在Python中使用is操作符来判断标识值是否相等。

代码实例:

Python

# None对象的标识值仅与None对象的标识值相等,if语句下面的代码永远不会执行
if False is None:
    print("never happen!")
    
future_of_dawdler = None
if future_of_dawdle is None:
    # 懒人前程一片黯淡
    print("just be diligent!!!")

15、什么是操作符与操作数?

操作符与操作数,均可以从其字面意思进行理解。操作符是指****进行数据运算的符号,比如加法计算中的+是加法操作符,减法计算中的-是减法运算符。操作数是指参与数据运算的数。按操作数与操作符之间的相对位置关系,操作数可分为左操作数与右操作数。

代码实例:

Python

result = 1 + 2

在上文代码中定义了一个result变量,然后将算数表达式1+2的结果的地址赋值给变量result。在算数表达式1+2中,操作符为+,位于+号左边的1为左操作数,位于+号右边的2为右操作数。

Python中的每一种运算都有其对应的操作符,比如赋值运算中的=号,逻辑运算中的and,or, not操作符,关系运算中的>,<,==操作符。

16、分析操作符is与==的区别与联系

is操作符用来判断对象的标识值是否相等,在CPython中,对象的标识值即为对象的内存地址。==是关系运算符,用来判断对象的值是否相等。Python中的内置函数id,用来获取对象的标识值,通过内置函数id,可以实现is操作符的功能。

代码实例:

Python

fighter = "chunli"
chunli = "chunli"

# 使用is操作符判断fighter对象与chunli对象的标识值是否相等
if fighter is chunli:
    print("fighter is chunli")
    
#  等价于下面的代码:
if id(fighter) == id(chunli):
    print("fighter is chunli")

操作符is与==的联系

is操作符用来比较标识值是否相等,是==运算的一种特殊情况。

17、如何理解字符集与字符编码?

字符集与字符编码的概念其实很简单,没这么复杂。字符集,顾名思义,就是一个字符的集合,比如将中国的所有汉字作为一个字符集,将所有拉丁字母作为一个字符集。而字符编码是指将字符集里面的字符用一个唯一的数字编码来表示。为什么需要用数字编码来表示一个字符呢?因为计算机只能处理二进制。我们如果需要让计算机处理字符,那么必须将它转换为二进制。举个简单的例子,将字符"我"用二进制00来进行表示,将字符"爱"用二进制01来进行表示,将字符"你"用二进制10来进行表示:

字符字符编码
00
01
10

Unicode编码

Python3中的字符串采用Unicode进行编码。Unicode既是一种字符集,也是一种编码规范。Unicode字符集囊括了ASCII字符,汉字,希腊字母、俄文字母等世界各国,各地区的文字字符。Unicode编码通常采用固定的两个字节来对字符进行编码,这种固定编码的方式是有局限的,比如ASCII字符只需要使用一个字节,使用两个字节来进行编码就带来了存储空间的浪费。为优化存储空间,以及提升对unicode字符的处理性能,在Unicode编码的基础上,又应运而生了UTF-8编码,UTF-16编码,UTF-32等编码,这几类都是变长编码。在UTF-8编码中,ASCII字符仍然使用1个字节来进行编码和存储,其它字符至少使用2个字节来进行编码和存储。

在Python中通过ord函数可以获取某一个字符的十进制编码:

Python

>>> ord('我')
25105
>>> ord('爱')
29233
>>> ord('你')
20320

通过chr函数可以将字符的数字编码转换为特定的字符:

Python

>>> chr(25105)
'我'
>>> ord(29233)
'爱'
>>> ord(20320)
'你'

二、基础算法题

2.1、比较两个字符串的大小

算法思路

(1) 计算字符串str1与str2的最短长度,假设为n, 只需在循环中遍历n次。

(2) 在循环中逐字符比较,以字符的先后大小关系确定字符串str1与字符串str2的大小关系

(3) 循环正常退出,再以字符串的长度大小来确定字符串的大小关系

代码实现

Python

def strcmp(str1,  str2):
    """
    :param str1: 参与比较的字符串
    :param str2: 参与比较的字符串
    :return: 0 表示str1与str2相等,1表示大于, -1则表示小于
    """
    length_of_str1, length_of_str2 = len(str1), len(str2)
    shortest_length = length_of_str1 if length_of_str1 <= length_of_str2 else  length_of_str2
    ret = 0
    index = 0

    while index < shortest_length:
        if str1[index] > str2[index]:
            return 1
        if str1[index] < str2[index]:
            return -1
        index += 1
    else:
        if length_of_str1 > length_of_str2:
            ret = 1
        elif length_of_str1 < length_of_str2:
            ret = -1
    return ret
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值