一、整数
divmod()函数可以同时得到商和余数,返回的是一个元组。
round(value):可以返回四舍五入的值
返回当前时间: import time
time.time(),但是计算机的时间是从1970年1月1日0:00:00开始返回值是秒的浮点数。
二、字符串:
8位的ASCLL码是16位的Unicode子集
转义字符: \续行符 \\反斜杠符 \'单引号 \"双引号 \b退格 \n换行 \t横向制表符 \r回车
不换行打印:print("aa",end=' ') . 默认换行符 结尾。
生成一个新字符串,不会改变原字符串
#slice字符串切片操作 [起始偏移量start:终止偏移量end:步长step]
split()分割和join()合并
a.capitalize()产生新字符串,首字母大写 a.title()每个单词首字母大写
a.upper()所有字母大写 a.lower()全部转为小写
a.swapcase()大小写转换. a.center()居中 等方法 可以随用随学。
format格式化
可变字符串
需要原地修改字符串,可以使用io.StringIO 对象或array 模块。
>>> import io
>>> s = "hello, sxt"
>>> sio = io.StringIO(s) #可变字符串
>>> sio
<_io.StringIO object at 0x02F462B0>
>>> sio.getvalue() #获取字符串的值
'hello, sxt'
>>> sio.seek(7) #指针移动到修改的位置(0开始)
7
>>> sio.write("g") #改为g
1
>>> sio.getvalue()
'hello, gxt'
三、列表
range()创建整数列表
>>> list(range(3,15,2))[3, 5, 7, 9, 11, 13]>>> list(range(15,3,-1))[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4]>>> list(range(3,-10,-1))[3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
append()方法
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。>>> a = [20,40]>>> a.append(80)>>> a[20, 40, 80]
extend()方法
>>> a = [20,40]>>> id(a)46016072>>> a.extend([50,60])>>> id(a)46016072
insert()插入元素
>>> a = [10,20,30]>>> a.insert(2,100)>>> a[10, 20, 100, 30]
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。>>> a = [10,20,30,40,50]>>> a.pop()50>>> a[10, 20, 30, 40]>>> a.pop(1)20>>> a[10, 30, 40]
remove()方法
删除首次出现的指定元素,若不存在该元素抛出异常。>>> a = [10,20,30,40,50,20,30,20,30]>>> a.remove(20)>>> a[10, 30, 40, 50, 20, 30, 20, 30]>>> a.remove(100)Traceback (most recent call last):File "<pyshell#208>", line 1, in <module>a.remove(100)ValueError: list.remove(x): x not in list
index()获得指定元素在列表中首次出现的索引
index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])。其中,start 和 end 指定了搜索的范围。>>> a = [10,20,30,40,50,20,30,20,30]>>> a.index(20)1>>> a.index(20,3)5>>> a.index(20,3)#从索引位置 3 开始往后搜索的第一个 205>>> a.index(30,5,7) #从索引位置 5 到 7 这个区间,第一次出现 30 元素的位置6
count()获得指定元素在列表中出现的次数
count()可以返回指定元素在列表中出现的次数。>>> a = [10,20,30,40,50,20,30,20,30]>>> a.count(20)3
len()返回列表长度
len()返回列表长度,即列表中包含元素的个数。
>>> a = [10,20,30]>>> len(a)3
切片操作
我们也可以通过内置函数 sorted()进行排序,这个方法返回新列表,不对原列表做修改。>>> a = [20,10,30,40]>>> id(a)46016008>>> a = sorted(a)#默认升序>>> a[10, 20, 30, 40]>>> id(a)45907848>>> a = [20,10,30,40]>>> id(a)45840584>>> b = sorted(a)>>> b[10, 20, 30, 40]>>> id(a)45840584>>> id(b)46016072>>> c = sorted(a,reverse=True)#降序>>> c[40, 30, 20, 10]
reversed()返回迭代器
内置函数 reversed()也支持进行逆序排列,与列表对象 reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。>>> a = [20,10,30,40]>>> c = reversed(a)>>> c<list_reverseiterator object at 0x0000000002BCCEB8>>>> list(c)[40, 30, 10, 20]>>> list(c)[]我们打印输出 c 发现提示是:list_reverseiterator。也就是一个迭代对象。同时,我们使用list(c)进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。
四、元组 tuple
列表关于排序的方法 list.sorted()是修改原列表对象,元组没有该方法。如果要对元组排序,只能使用内置函数 sorted(tupleObj),并生成新的列表对象。>>> a = (20,10,30,9,8)>>> sorted(a)[8, 9, 10, 20, 30]
zip(列表 1,列表 2,...)将多个列表对应位置的元素组合成为元组,并返回这个 zip 对象。
>>> a = [10,20,30]>>> b = [40,50,60]>>> c = [70,80,90]>>> d = zip(a,b,c)>>> list(d)[(10, 40, 70), (20, 50, 80), (30, 60, 90)]
生成器推导式创建元组
>>> s = (x*2 for x in range(5))>>> s<generator object <genexpr> at 0x0000000002BDEB48>>>> tuple(s)(0, 2, 4, 6, 8)>>> list(s)#只能访问一次元素。第二次就为空了。需要再生成一次[]>>> s<generator object <genexpr> at 0x0000000002BDEB48>>>> tuple(s)()>>> s = (x*2 for x in range(5))>>> s.__next__()0>>> s.__next__()2>>> s.__next__()4
元组总结
五、字典
字典是“键值对”的无序可变序列,字典中的每个元素都是一个“键值对”,包含:“键 对象”和“值对象”。可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。 列表中我们通过“下标数字”找到对应的对象。字典中通过“键对象”找到对应的“值 对象”。“键”是任意的不可变数据,比如:整数、浮点数、字符串、元组。但是:列表、 字典、集合这些可变对象,不能作为“键”。并且“键”不可重复。 “值”可以是任意的数据,并且可重复。
字典的创建1. 我们可以通过{}、dict()来创建字典对象。>>> a = {'name':'gaoqi','age':18,'job':'programmer'}>>> b = dict(name='gaoqi',age=18,job='programmer')>>> a = dict([("name","gaoqi"),("age",18)])>>> c = {}#空的字典对象>>> d = dict()#空的字典对象2. 通过 zip()创建字典对象>>> k = ['name','age','job']>>> v = ['gaoqi',18,'techer']>>> d = dict(zip(k,v))>>> d{'name': 'gaoqi', 'age': 18, 'job': 'techer'}3. 通过 fromkeys 创建值为空的字典>>> a = dict.fromkeys(['name','age','job'])>>> a{'name': None, 'age': None, 'job': None}
字典元素的访问
为了测试各种访问方法,我们这里设定一个字典对象:a = {'name':'gaoqi','age':18,'job':'programmer'}1. 通过 [键] 获得“值”。若键不存在,则抛出异常。>>> a = {'name':'gaoqi','age':18,'job':'programmer'}>>> a['name']'gaoqi'>>> a['age']18>>> a['sex']Traceback (most recent call last):File "<pyshell#374>", line 1, in <module>a['sex']KeyError: 'sex'2. 通过 get()方法获得“值”。推荐使用。优点是:指定键不存在,返回 None;也可以设定指定键不存在时默认返回的对象。推荐使用 get()获取“值对象”。>>> a.get('name')'gaoqi'>>> a.get('sex')>>> a.get('sex','一个男人')'一个男人'3. 列出所有的键值对>>> a.items()dict_items([('name', 'gaoqi'), ('age', 18), ('job', 'programmer')])4. 列出所有的键,列出所有的值>>> a.keys()dict_keys(['name', 'age', 'job'])>>> a.values()dict_values(['gaoqi', 18, 'programmer'])5. len() 键值对的个数6. 检测一个“键”是否在字典中>>> a = {"name":"gaoqi","age":18}>>> "name" in aTrue
六、集合
集合创建和删除1. 使用{}创建集合对象,并使用 add()方法添加元素>>> a = {3,5,7}>>> a{3, 5, 7}>>> a.add(9)>>> a{9, 3, 5, 7}2. 使用 set(),将列表、元组等可迭代对象转成集合。如果原来数据存在重复数据,则只保留一个。>>> a = ['a','b','c','b']>>> b = set(a)>>> b{'b', 'a', 'c'}3. remove()删除指定元素;clear()清空整个集合>>> a = {10,20,30,40,50}>>> a.remove(20)>>> a{10, 50, 30}
七、控制语句
三元条件运算符
Python 提供了三元运算符,用来在某些简单双分支赋值情况。三元条件运算符语法格式如
下: 条件为真时的值 if (条件表达式) else 条件为假时的值
上一个案例代码,可以用三元条件运算符实现:
num = input("请输入一个数字")
print( num if int(num)<10 else "数字太大")
可以看到,这种写法更加简洁,易读
【操作】已知点的坐标(x,y),判断其所在的象限
x = int(input("请输入 x 坐标"))
y = int(input("请输入 y 坐标"))
if(x==0 and y==0):
print("原点")
elif(x==0):
print("y 轴")
elif(y==0):
print("x 轴")
elif(x>0 and y>0):
print("第一象限")
elif(x<0 and y>0):
print("第二象限")
elif(x<0 and y<0):
print("第三象限")
else:
print("第四象限")
选择结构嵌套
选择结构可以嵌套,使用时一定要注意控制好不同级别代码块的缩进量,因为缩进量决定了
代码的从属关系。
【操作】输入一个分数。分数在 0-100 之间。90 以上是 A,80 以上是 B,70 以上是 C,60 以上是 D。60 以下是 E。
score = int(input("请输入一个在 0-100 之间的数字:"))
grade = ""
if score>100 or score<0:
score = int(input("输入错误!请重新输入一个在 0-100 之间的数字:"))
else:if score>=90:
grade = "A"
elif score>=80:
grade = 'B'
elif score>=70:
grade = 'C'
elif score>=60:
grade = 'D'
else:
grade = 'E'
print("分数为{0},等级为{1}".format(score,grade))
循环结构
while 循环
【操作】利用 while 循环打印从 0-10 的数字。
num = 0
while num<=10:
print(num)
num += 1
for 循环和可迭代对象遍历
可迭代对象
Python 包含以下几种可迭代对象:
1. 序列。包含:字符串、列表、元组
2. 字典
3. 迭代器对象(
iterator)
4. 生成器函数(generator)
5. 文件对象
嵌套循环和综合练习
一个循环体内可以嵌入另一个循环,一般称为“嵌套循环”,或者“多重循环”。
【操作】打印如下图案
for x in range(5):
for y in range(5):
print(x,end="\t")
print() #仅用于换行
【操作】利用嵌套循环打印九九乘法表
for m in range(1,10):
for n in range(1,m+1):
print("{0}*{1}={2}".format(m,n,(m*n)),end="\t")
print()
break 语句
break 语句可用于 while 和 for 循环,用来结束整个循环。当有嵌套循环时,break 语句只
能跳出最近一层的循环。
【操作】使用 break 语句结束循环
while True:
a = input("请输入一个字符(输入 Q 或 q 结束)")
if a.upper()=='Q':
print("循环结束,退出")
break
else:
print(a)
continue 语句
continue语句用于结束本次循环,继续下一次。多个循环嵌套时,也是应用于最近的一层循环。
循环代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:
1. 尽量减少循环内部不必要的计算
2. 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
3. 局部变量查询较快,尽量使用局部变量
其他优化手段
1. 连接多个字符串,使用 join()而不使用+
2. 列表进行元素插入和删除,尽量在列表尾部操作
使用 zip()并行迭代
我们可以通过 zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止。
【操作】测试 zip()并行迭代
八、函数
4. 调用函数之前,必须要先定义函数,即先调用 def 创建函数对象
(1) 内置函数对象会自动创建
#测试浅拷贝和深拷贝import copydef testCopy():'''测试浅拷贝'''a = [ 10 , 20 , [ 5 , 6 ]]b = copy.copy(a)print ( "a" , a)print ( "b" , b)b.append( 30 )b[ 2 ].append( 7 )print ( "浅拷贝......" )print ( "a" , a)print ( "b" , b)def testDeepCopy():'''测试深拷贝'''a = [ 10 , 20 , [ 5 , 6 ]]b = copy.deepcopy(a)print ( "a" , a)print ( "b" , b)b.append( 30 )b[ 2 ].append( 7 )print ( "深拷贝......" )print ( "a" , a)print ( "b" , b)testCopy()print ( "*************" )testDeepCopy()运行结果:a [10, 20, [5, 6]]b [10, 20, [5, 6]]浅拷贝......a [10, 20, [5, 6, 7]]b [10, 20, [5, 6, 7], 30]*************a [10, 20, [5, 6]]b [10, 20, [5, 6]]深拷贝......a [10, 20, [5, 6]]b [10, 20, [5, 6, 7], 30]
参数的几种类型
执行结果:
【操作】测试可变参数处理(元组、字典两种方式)
def f1(a,b,*c):print(a,b,c)f1(8,9,19,20)def f2(a,b,**c):print(a,b,c)f2(8,9,name='gaoqi',age=18)def f3(a,b,*c,**d):print(a,b,c,d)f3(8,9,20,30,name='gaoqi',age=18)执行结果:8 9 (19, 20)8 9 {'name': 'gaoqi', 'age': 18}8 9 (20, 30) {'name': 'gaoqi', 'age': 18}执行结果:8 9 (19, 20)8 9 {'name': 'gaoqi', 'age': 18}8 9 (20, 30) {'name': 'gaoqi', 'age': 18}
def f1(*a,b,c):print(a,b,c)#f1(2,3,4)#会报错。由于 a 是可变参数,将 2,3,4 全部收集。造成 b 和 c 没有赋值。f1(2,b=3,c=4)执行结果:(2,) 3 4
eval()函数
#测试 eval()函数s = "print('abcde')"eval (s)a = 10b = 20c = eval ( "a+b" )print (c)dict1 = dict ( a = 100 , b = 200 )d = eval ( "a+b" ,dict1)print (d)eval 函数会将字符串当做语句来执行,因此会被注入安全隐患。比如:字符串中含有删除文件的语句。那就麻烦大了。因此,使用时候,要慎重!!!
递归函数
nonlocal 关键字
LEGB 规则
九、 面向对象初步
Python 中,“一切皆对象”。类也称为“类对象”,类的实例也称为“实例对象”。
【操作】一个典型的类的定义
class Student:def __init__(self,name,score): #构造方法第一个参数必须为 selfself.name = name #实例属性self.score = scoredef say_score(self): #实例方法print(self.name,'的分数是:',self.score)s1 = Student('张三',80) #s1 是实例对象,自动调用__init__()方法s1.say_score()
__init__构造方法和__new__方法
我们可以更进一步的说,一个 Python 对象包含如下部分:
5. __init__()方法:初始化创建好的对象,初始化指的是:“给实例属性赋值”
6. __new__()方法: 用于创建对象,但我们一般无需重定义该方法。