数据结构与算法python实现Chap1
2020-08-14 本文已影响0人
手捧樱花v
- 计算学生GPA
points = {'A+':4.0,'A':4.0,'B+':3.67}
num_courses = 0
total_score = 0
done = False
while not done:
grade = input()
if grade == '':
done = True
elif grade not in points:
print("Unknown '{}' being ignored".format(grade))
else:
num_courses +=1
total_score = points[grade]
if num_courses > 0 : # avoid division by zero
print("your GPA is '{0:.3}'".format(total_score/num_courses))
>>>print("'{0}','{1}','{0}'".format("hello","world"))
>>>hello world hello
-
如果对象的一个别名被赋值语句重新赋予了新的值,并不影响已存在的对象,而是给别名重新分配了存储对象
-
字符串检查是否以xx开头,return True/False,一些方法返回一个对象的状态信息,是胆识并不改变改状态,这些方法被成为访问器;其他方法,例如list类的sort方法,会改变一个对象的状态,这些方法被称为应用程序或更新方法
response = "wertyuRIEJIJIJIEopasdfghjklzxcvbnm"
a = response.lower().startswith('y')
-
两种实例化方式:通过调用类的构造函数;间接创建类的实例的方法
-
数值的字符串可以被int识别,默认情况下字符串必须使用十进制,若想识别十六进制的字符串则int('7f',16)表示,然而float('3.14')会提示valueError,float类不可变
print(int('123'))
>>> 123
print(float('3.14')
>>> ValueError: invalid literal
- 序列类型:list tuple str ,单个元素tuple需要加上都好,否则被识别为int/string...
- 创建空集合只能使用set() 因为{}会创建一个空字典,set无序不重复,set中不存在集合/列表
>>> a = set(("hello",))
>>> print(a)
{'hello'}
>>> a = set(("hello"))
>>> print(a)
{'l', 'o', 'e', 'h'}
8.列表类操作+=和 = +的差别
>>> a = 1
>>> b = a
>>> b += 5
>>> b = b + 5
>>> print(a)
1
>>> a = [1]
>>> b = a
>>> b += [2,3]
>>> b = b + [5,6]
>>> print(a)
[1, 2, 3]
- 条件/循环语句每个条件都是布尔表达式,所以可以简写While True:
- 获取list中最大值(不使用内置函数)
sakura = [1,3,23,5,6,7,8,333]
biggest = sakura[0]
for i in range(len(sakura)):
if sakura[i] > biggest:
biggest = sakura[i]
print(biggest)
- continue会使当前迭代停止,但循环过程的后续迭代正常进行
sakura = (1,3,23,5,6,7,8,333)
for i in sakura:(过滤掉23)
if i == 23:
continue
print(str(i)+"this is what i want")
1this is what i want
3this is what i want
5this is what i want
6this is what i want
7this is what i want
8this is what i want
333this is what i want
- 函数:不用了解特定类的内容或该类的实例,sorted(data);方法:描述一个成员函数,在调用特定对象时使用面向对象的消息传递语法,data.sort();def作为函数的签名;每次调用函数时,python会创建一个专用的活动记录用来存储当前调用相关的信息,这个活动记录包括了命名空间,命名空间用于管理当前调用中局部作用域内所有的标识符
- 通常会对input结合split
sakura = input ("enter seperate by spaces : ")
pieces = sakura.split("")
x = pieces[0]
- open:must have exactly one of create/read/write/append mode
rw tell()位置=0 a模式在文末 fp.seek(偏移量,起始位置(0文件头/1当前/2文末)) fp.read(k)返回当前位置后k位
在写文件时不会再尾部追加换行符
fp = open('./sakura.txt','w')
print(fp.tell())
fp.seek(6,0)
fp.write("leslie")
# print(fp.read())
fp.close()
- 抛出异常:异常如果没有捕获,可能会导致解释器停止运行,后端校验
python3.8停用import collections
抽象基类collections.Iterable包含所有确保支持for循环语法的python迭代容器类型(list/tuple/set) 若value不是一个迭代类型,尝试使用for循环会引发TypeError
from collections.abc import Iterable
def sqrt(x):
if not isinstance(x,(int,float)): (第二个参数表示的所允许类型的元组)
raise TypeError('x must be numeria')
elif x < 0:
raise ValueError('x cannot be negative')
def summ(value):
if not isinstance(value, Iterable):
raise TypeError('parameter must be integer')
total = 0
for v in value:
if not isinstance(v, (int, float)):
raise TypeError('elements must be numeric')
total += v
return total
print(summ([1,2,3,]))
- 捕捉异常: 使用try-expect而不是raise的想法是只要异常发生时,有一个处理问题的机制就可以了,try块后面会跟一个或多个except子句,优势是非特殊情况下高效运行,不需要多余的检查异常条件,然而在处理异常时,花费的时间更多
try:
age = int(input("enter your age: "))
if age <= 0:
print('your age must be positive')
except(ValueError,EOFError):
print('invalid response')
try-expect两个特征: 允许最后一个except不加特定的错误类型来捕获一些异常;一个try语句允许有finally子句,总是会被执行,无论正常或异常,常用于清理工作,如关闭一个文件
- 迭代器对象,iter(obj)产生一个迭代器,同一个可迭代对象可创建多个迭代器,保存原始列表的当前索引,如果原始列表的内容在迭代器构造之后但在迭代完成之前被修改,迭代器将报告原始列表的更新内容
sakura = [1,3,23,5,6,7,8,333]
i = iter(sakura)
print(type(i)) >>> <class 'list_iterator'>
for i in iter(sakura):
print(type(i)) >>> <class 'int'>
iter返回一个对象的迭代器,对象迭代直接返回引用,打印出来时引用类型,for in就是打印迭代器的对象
值类型: 对象本身不允许修改,数值的修改实际上是让变量指向了一个新的对象,包含: 字符串/元组/数值/本身不允许被修改
引用类型: 对象本身可以修改,包含: 列表/字典/本身允许修改
python还支持隐式迭代,调用range(1000)不是返回一个数字列表,而是返回一个可迭代的对象,惰性计算
利用迭代器简单的创建元组或集合 list[range(10000)]
- python next(iterator,default[用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常])在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。运用于:只计算需要的数,并且整个系列的数不需要一次性全部驻留在内存中,当结果不需要存储在内存中,生成器语法特别有优势
- 复合表达式:total = sum(k*k for k in range(1,n+1) if n > 0)
- 元组的自动打包 data = a,b,c,d ; return x,y ; 序列打包: a,b,c,d = range(7,11); 字典for x,y in {(7,2),(4,3)}