一,尽可能多的列出已学过的数据类型,对比介绍他们的特点和用途(10分)
数据类型
- int: float: complex: str: bytes: byterarry: bool:
- 字节序bytes: 在二进制世界里只有0和1,其中每一个字节有8位,为了方便人们的理解字节序用b’string’表示,是一个不可变的数据类型,
-
可变字节序列byterarry:它相对于bytes而言,多了一个可修改的功能
-
字符串str:字符串用引号表示【‘ ’,““ ””,“““ ”””】,也是一个不可变的数据类型,和元组一样操作它也是从新生成一个全新的,全世界一半以上的算力基本都在处理字符串,在文本操作中用的都是字符串,
数据结构(只要是线性数据结构都能切片)
-
列表list:列表用‘[ ]’表示,是一个有序可变的引用类型数据结构,由于其在内存中开辟的存储空间是连续的,所以可以用索引快速访问他的每一个元素,也正是因为是连续的存储空间,在列表的的非末尾增删时,会引起增删点后面的元素的大量挪动,此时如果所需的连续空闲空间不足,会导致程序崩溃,但在列表末尾用append按位增加,或用pop按位弹出,亦或用extend追加iterable对象等效率都是O(1)
-
链表linked list:链表分为单向和双向链表,和列表一样都是有序可变序列,但是其开辟的内存空间是不连续的,可以理解为他在一个连续的内存空间里是【4,1,3,2】,但在人们操作它时,表现形式为【1,2,3,4】。就像一串珠子通过一条线连接,因此在对其中间进行插入操作时是非常方便的,只需要断开两珠子之间的线然后在连接即可,但是要在链表中用索引时就麻烦了,以为我们根本不知道这个索引对象在哪,只能从索引‘0’或‘-1’开始一个一个的找,
-
栈stack:栈的特点是LILO,后进后出,就像抢的弹夹一样,一发一发的压在一起,当我们要取最下面的子弹时,只能把上面的子弹全部取出,此结构多用于函数的压栈,
-
队列queue:队列的特点是FIFO,先进先出,只能在其首尾进行操作,
-
元组tuple:元组用‘( )’表示,是一个有序但不可变序列,表面上对元组的增删操作其实是生成了一个新的元组,不能对其进行增删改,但是可以迭代它。
-
字典dict:字典用‘{key:value}’表示,是一个可变,无序,不重复,的数据结构,它采用了和其他线性结构不同的对key进行hash计算,每一个可哈希的值哈希后会得到唯一的值,这就保证了字典数据不重复,hash函数在每一次shell的运行中会生成一个足够大的值用于取模运算,保证了在当次内核运行中的冥等性,当然也有极低的概率出现两个对象出现相同的哈希值,叫哈希冲突,
-
集合set:基本和字典一样,只有连个不同点他没有指点的value,生成空集合时不能直接用‘{}’,只能用set()
二,分别简述return,yield,continue,break,if else,while else(10分)
-
return:其只在函数中出现,当函数运行时碰到return就会立即退出函数运算,并返回return值,一个函数可以没有return,此时当函数执行完所有语句时就会结束并返回一个默认值None,当然函数中也可以有多个return解释器关键字,次时函数执行到某个分支是碰到return也会返回,return后可写返回值,不写默认返回None
-
yield:其作为生成器函数的关键字,当函数碰到该关键字时,会暂停执行并返回yield值,生成器函数可以用for in迭代,也可以用next(iter,defalut),用next时生成器只能碰到一次yield返回一个值,没有返回值则返回None,同时python还提供了人机交互的iter.send()功能,方便我们对函数进行交互
-
continue:结束当层当次循环,进行当层的下一次循环
-
break:终止,退出当层循环
-
if else:当if条件为True时,不执行else语句。只有当if的条件为False时才执行了else语句
-
while else:当while为一个死循环时,不会执行else,只要while的条件为False时,就会执行else
三,简述列表解析式和生成器表达式功能和特点(5分)
-
列表解析式:[i for i in iterable]立即生成一个列表需开辟连续的内存空间,当其内部的表达式计算一个值需要大量时间时,最后输出结果需要等待一段时间
-
生成器表达式:(i for i in iterable)生成一个惰性求值,延迟计算的迭代器,它需要用for in,next驱动,每一次驱动才会计算一次,用next驱动但没有设置defalut时会报错,一定要注意生成器的闭包与其内部的标识符及函数的作用域,极容易出错
s = 0
a = (s+i for i in range(1))
s = 2
for j in a:
print(j)
#输出2
- 最后生成器的s变成2而不是之前定义的0,生成器只是记住了变量而已
四,解释python中的闭包,并写出代码(5分)
- 闭包出现的情况是要有嵌套函数,内层的函数引用了外层函数的自由变量(对于内层来讲叫做自由变量)。当函数调用结束后其内层的函数使用了外层的自由变量,可是内层函数并没有释放(被其它标识符记住)导致该自由变量也不会消亡,此现象称为闭包
def foo():
a = 0
def too():
nonlocal a
a += 1
return a
return too
b = foo()
b()
#输出1
五,统计制定正整数n(包含n)以内的奇数和(5分)
def oddn_sum(x):
sum1 = 0
for i in range(1,n+1):
if i & 1:
sum1 += i
return sum1
num = int(input('natural number'))
oddn_sum(num)