注释
单行注释:# 注释内容
多行注释:’’’ 注释
内容’’’
注意该方法只能用一次,第二次会被当作是字符串,即变量。
变量
声明变量
a = 1print(a)
变量定义的规则
- 变量由字母、下划线和数字组合而成
- 变量不能以数字开头
- 变量不能与关键字相同:
- [‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’, ‘finally’,
‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’, ‘print’, ‘raise’, ‘return’, ‘try’,
‘while’, ‘with’, ‘yield’]
- 变量的定义要能见名知意。
变量命名的方法
常见方法:
骆驼法(开头小写)
如:printEmployeePaychecks()
print_employee_paychecks()
帕斯卡法(与骆驼法相似,只是开头大写)变量的赋值
a = "变量1"b = "变量2"

![S6}3J6JA5R{APE14@$M2ZP.pnga = "变量1"b = a
程序交互
输入
student_name = input("请输入用户名:")student_pwd = input("请输入密码:")
格式化输出
结果print("欢迎" + student_name + "来到英格")print("欢迎%s来到英格" % student_name)print("欢迎{}来到英格".format(student_name))print("用户名是{0},密码是{1}".format(student_name, student_pwd))print("用户名是{1},密码是{0}".format(student_name, student_pwd))print("用户名是{name},密码是{pwd}".format(name=student_name, pwd=student_pwd))
请输入用户名:lisi请输入密码:1欢迎lisi来到英格欢迎lisi来到英格欢迎lisi来到英格用户名是lisi,密码是1用户名是1,密码是lisi用户名是lisi,密码是1
基础数据类型
整型(int)
在 32 位机器上,整数的位数为 32 位,取值范围为 -231~231-1,即 -2147483648~2147483647
在 64 位系统上,整数的位数为 64 位,取值范围为 -263~263-1,即 -9223372036854775808~
9223372036854775807
注意:在python3中不再有long类型了,全部是int
a = 2**64print(type(a)) #type()是查看数据类型的方法
运行结果
<class 'int'>
布尔值(True,False)
布尔类型只有两个值,真或假,用于记逻辑判断
a = 3b = 5print(a < b, a > b , a != b)
运行结果
True False True
字符串(str)
在python中加了引号的字符都被认为是字符串。
a = "人生苦短,我用python"b = '''欢迎光临今天学习python'''print(a, b)
运行结果
人生苦短,我用python欢迎光临今天学习python
字符串的索引与切片
切片的顾头不顾腚原则:
[a:b] 能取到a,取不到b(取到b-1)
str_a = "ABCDEFGHIJK"print(str_a[0])print(str_a[-1])# 切片,顾头不顾腚原则print(str_a[0:-1])# 切片不填默认到最后一个值print(str_a[:])print(str_a[2:])print(str_a[:-4])print(str_a[-1::-2]) #从最后一个开始到第一个,步长-2print(str_a[0::2])
运行结果
AKABCDEFGHIJABCDEFGHIJKCDEFGHIJKABCDEFGKIGECAACEGIK
字符串常用方法
字符串拼接
c = 'home 'd = 'welcome 'print(d + c, '*' * 3, d * 3)
运行结果
welcome home *** welcome welcome welcome
大小写
words = "life is short, i need python"print(words.capitalize())print(words.swapcase())print(words.title())
运行结果
Life is short, i need pythonLIFE IS SHORT, I NEED PYTHONLife Is Short, I Need Python
内容居中(总长度,空白处填充)center
a = "test"ret = a.center(20,"*")print(ret)
运行结果
********test********
统计字符串中的元素出现的个数 count
ret = words.count("e",0,30)print(ret)
运算结果
3
判断字符串的开头和结尾 startwith endwith
a = "aisdjioadoiqwd12313assdj"print(a.startswith("a"))print(a.endswith("j"))print(a.startswith('sdj',2,5))print(a.endswith('ado',7,10))
运行结果
TrueTrueTrueTrue
寻找字符串中的元素 find ```python print(a.find(‘sdj’,1,10)) # 返回的找到的元素的索引,如果找不到返回-1 print(a.index(‘sdj’,1,10)) # 返回的找到的元素的索引,找不到报错。
print(a.find(‘hahah’,1,10)) # 返回的找到的元素的索引,如果找不到返回-1 print(a.index(‘hahaha’,1,10)) # 返回的找到的元素的索引,找不到报错。
运行结果```python22Traceback (most recent call last):File "C:/Users/mi/PycharmProjects/untitled/1.py", line 37, in <module>print(a.index('hahaha',1,10)) # 返回的找到的元素的索引,找不到报错。ValueError: substring not found-1
分割 split
words = "life is short, i need python"ret = words.split(' ')print(ret)ret = words.rsplit(' ',2) #从右往左分割,遇到空格分割一次,共分割两次print(ret)
运行结果
['life', 'is', 'short,', 'i', 'need', 'python']['life is short, i', 'need', 'python']
弹出 strip
a = '****asdasdasd********'print(a.strip('*'))print(a.lstrip('*'))print(a.rstrip('*'))
运行结果
asdasdasdasdasdasd************asdasdasd
替代 replace
words = "life is short, i need python"print(words.replace('e','a',2)) # 字符串从左向右开始,把e替换成a,一共替换两次print(words.isalnum()) #字符串由字母或数字组成print(words.isalpha()) #字符串只由字母组成print(words.isdigit()) #字符串只由数字组成
运行结果
lifa is short, i naed pythonFalseFalseFalse
基本运算符
定义a=10,b=20
算术运算
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 加 | a+b=30 |
| - | 减 | b-a=10 |
| * | 乘 | a*b=200 |
| / | 除 | b/a=2.0 |
| % | 取余 | b%a=0 |
| ** | 幂 | a**b=100000000000000000000 |
| // | 取整 | b//a=2 |
比较运算
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 等于,比较两个值是否相等 | (a == b)返回False |
| != | 不等于,比较两个值是否不等 | (a != b)返回True |
| <> | 不等于,比较两个值是否不等 | (a <> b)返回True |
| > | 大于,比较x是否大于y | (a > b)返回False |
| < | 小于,比较x是否小于y | (a < b)返回True |
| >= | 大于等于 | (a>= b)返回False |
| <= | 小于等于 | (a <= b)返回True |
逻辑运算
| 运算符 | 描述 | 实例 |
|---|---|---|
| and | 与运算,全部为真才为真,否则为假 | (a and b)返回true |
| or | 或运算,有一个为真则为真 | (a or b)返回true |
| not | 非运算,真返回假,假返回真 | not(a and b)返回false |
运算符优先级
| 运算符 | 描述 |
|---|---|
| ** | 指数 |
| ~+- | 按位反转,一元加号和减号 |
| */%// | 乘,除,取余和取整除 |
| +- | 加法和减法 |
| >><< | 右移和左移 |
| & | 位’And’ |
| ^ | 位运算符 |
| ><>=<= | 比较运算符 |
| <>==!= | 等于运算符 |
| =,+=,-=,*= | 赋值运算符 |
| is,is not | 身份运算符 |
| in,not in | 成员运算符 |
| not and or | 逻辑运算符 |
python数据类型
元组 tuple
元组又可以成为只读列表,即数据可以被查询,但是不能被修改。
列表 list
列表可以存储大量不同类型的数据,列表是有序的,有索引值,可切片,方便取值。
增
list1 = [1, 'a', 2, 'b', 3, 'c']list1.insert(0, 'hello') #指定位置插入print(list1)list1.append('world') #增加到最后print(list1)list1.extend(['q,a,w'])print(list1)list1.extend(['q,a,w', 'das']) #迭代增加到最后print(list1)
运行结果
['hello', 1, 'a', 2, 'b', 3, 'c']['hello', 1, 'a', 2, 'b', 3, 'c', 'world']['hello', 1, 'a', 2, 'b', 3, 'c', 'world', 'q,a,w']['hello', 1, 'a', 2, 'b', 3, 'c', 'world', 'q,a,w', 'q,a,w', 'das']
删
list1 = [1, 'a', 2, 'b', 3, 'c']list1.pop(1) #按位置删除,有返回值print(list1)del(list1[2:4]) #按位置删除,可以切片删除,无返回值print(list1)list1.remove('c') #删除指定元素print(list1)list1.clear() #清空列表print(list1)
运行结果
[1, 2, 'b', 3, 'c'][1, 2, 'c'][1, 2][]
改
list1 = [1, 'a', 2, 'b', 3, 'c']list1[1] = 'aaa'print(list1)list1[2:3] = [22, 'e'] #列表的第三个元素改为22和'e'两个元素,其后的元素往后顺移print(list1)
运行结果
[1, 'aaa', 2, 'b', 3, 'c'][1, 'aaa', 22, 'e', 'b', 3, 'c']
查
查询的两个方法:切片或者循环
list1 = [1, 'a', 2, 'b', 3, 'c']print(list1[0])print(list1[0:2])for i in range(6):print(list1[i])
运行结果
1[1, 'a']1a2b3c
其他操作
list2 = [0, 1, 2, 3, 4, 4, 5, 3, 2, 7]print(list2.count(4)) #计算元素在列表中共出现几次print(list2.index(1)) #从左往右索引元素第一次在列表中出现的位置list2.sort() #将列表排序,从左往右由小到大print(list2)list2.reverse() #将列表中的元素反向存放print(list2)
运行结果
21[0, 1, 2, 2, 3, 3, 4, 4, 5, 7][7, 5, 4, 4, 3, 3, 2, 2, 1, 0]
字典 dict
字典是python中唯一的映射类型,采用键值对(key - value)存储数据。python对key进行哈希运算得到value的存储地址,这表示key必须要是可哈希的,即key是不可变类型如数字、字符串、元组。
python3.5 以前字典是无序的,之后字典变成有序的了,要了解原因得要先了解字典的存储方式。
- python3.5之前
当我们初始化一个空字典时,CPython会在底层初始化一个二维数组,这个数组有8行,3列,如下面示意图所示:
my_dict = {}'''[[---,---,---][---,---,---][---,---,---][---,---,---][---,---,---][---,---,---][---,---,---][---,---,---]]'''
现在我们往这个空字典里加入一条数据
mt_dict['name'] = {'python'}#此时内存如下'''[[---,---,---][---,---,---][---,---,---][-3219953380708220565,指向'name'的指针,指向'python'的指针][---,---,---][---,---,---][---,---,---][---,---,---]]'''
这里要解释一下为什么内存是这样的,首先我们添加了一条键值对 ‘name’:’python’ ,然后python对这条键值对的key进行哈希运算
print(hash('name'))-3219953380708220565
然后将哈希运算后得到的值除8取余得到3
print(hash('name') % 8)3
所以在二维数组的下标为3的那一行存储数据,第一列存放键的哈希值,第二列存放指向键的指针,第三列存放指向值的指针。
由于python里的hash函数只在每一个运行时保持不变,不同运行时的运算结果都可能改变,这就导致由哈希值运算得到的键值对的存储位置每一个运行时都可能不同,所以字典是无序的。
- python3.5之后
当我们初始化一个空字典时,python会初始化两个数组,一个长度为8一维数组,一个空的二维数组。
my_dict = {}#此时内存示意图'''indices = [None,None,None,None,None,None,None,None]entries = []'''
这之后我们添加一条数据
my_dict['name'] = {'python'}#此时内存示意图'''indices = [None,None,None,0,None,None,None,None]entries = [[-3219953380708220565,指向'name'的指针,指向'python'的指针]]'''
内存会是这样是因为,对’name’运算后哈希值为-3219953380708220565,哈希值%8得到3,于是一维数组下标为3的位置存入0,而在二维数组下标0的位置存入键值对相对应的数据。
打个比方,一维数组是值班室,二维数组是仓库,要把货物存放进仓库,首先要去值班室登记,去那个值班室是随机的(哈希运算key得到)。假设来了一个货物,到值班室登记第一个货物到达,然后去第一个仓库把货物存进去;第二个货物来了,随机去一个值班室登记第二个货物到达,然后去第二个仓库把货物存进去,往后以此类推。
这样做的好处是哪怕每一个运算时对key的哈希运算值不一样,改变的也只是一维数组的顺序,二维数组是按照键值对插入的次序排的,次序不会改变,即字典是有序的。
增
dic = {"age":18, "name":"aaron"}dic['li'] = ["a","b","c"]print(dic)#向字典中添加键值对,如果只有键则值默认为none,如果字典中已存在要添加的键则他不会更改或覆盖dic.setdefault('k','v')print(dic)dic.setdefault('k','v1')print(dic)
运行结果
{'age': 18, 'name': 'aaron', 'li': ['a', 'b', 'c']}{'age': 18, 'name': 'aaron', 'li': ['a', 'b', 'c'], 'k': 'v'}{'age': 18, 'name': 'aaron', 'li': ['a', 'b', 'c'], 'k': 'v'}
删
# pop根据key删除键值对,并返回对应的值,如果没有key则返回默认返回值dic = {"age":18, "name":"aaron"}dic_pop = dic.pop('age')print(dic_pop)dic_pop = dic.pop('sex','查无此项')print(dic_pop)#运行结果18查无此项##########################dic['age'] = 18print(dic)del dic['name']print(dic)#运行结果{'name': 'aaron', 'age': 18}{'age': 18}##########################dic['name'] = 'demo'#随机删除字典中的某个键值对,将删除的键值对以元祖的形式返回dic_pop = dic.popitem()print(dic_pop)#清空字典dic_clear = dic.clear()print(dic,dic_clear)#运行结果('name', 'demo'){} None
改
dic = {"age":18, "name":"aaron", 'sex':'male'}dic2 = {"age":30, "name":'demo'}dic2.update(dic)# 将dic所有的键值对覆盖添加(相同的覆盖,没有的添加)到dic2中print(dic2)dic2['age'] = 30print(dic2)#运行结果{'age': 18, 'name': 'aaron', 'sex': 'male'}{'age': 30, 'name': 'aaron', 'sex': 'male'}
查
dic = {"age":18, "name":"aaron", 'sex':'male'}value = dic['name']print(value)# 没有对应的键值对会报错value = dic.get('abc','查无此项')print(value)#运行结果aaron查无此项
其他操作
dic = {"age":18, "name":"aaron", 'sex':'male'}for i in dic.items():# 将键和值作为元祖列出print(i)#运行结果('age', 18)('name', 'aaron')('sex', 'male')######################################for key,value in dic.items():print(key,value)#运行结果age 18name aaronsex male#######################################for i in dic:# 只是迭代键print(i)#运行结果agenamesex#######################################keys = dic.keys()print(keys,type(keys))value = dic.values()print(value,type(value))#运行结果dict_keys(['age', 'name', 'sex']) <class 'dict_keys'>dict_values([18, 'aaron', 'male']) <class 'dict_values'>
集合 set
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希
(所以集合做不了字典的键)的。以下是集合最重要的两点:
- 去重,把一个表变成集合就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系。
创建集合
set1 = set({1,2,'barry'})set2 = {1,2,'barry'}
增
s.add( x )
将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
add添加的是哈希数据类型(不可变),如整型、元组、字符串。且add不会影响集合中已有的元素,例如集合中已有a,在add添加a集合中最后也只有一个a。
s.update( x )
x 可以有多个,用逗号分开。
update添加的是可迭代的数据类型,如字符串、元组、列表、字典和集合。添加方法是分解成字符。
set1 = {'abc','def',123,'asdas'}set1.add('qwer')print(set1)set1.update('A')#update:迭代着增加print(set1)set1.update('哈哈哈')print(set1)set1.update([1,2,3])print(set1)#运行结果{'asdas', 'abc', 'def', 'qwer', 123}{'asdas', 'A', 'abc', 'def', 'qwer', 123}{'asdas', '哈', 'A', 'abc', 'def', 'qwer', 123}{1, 'asdas', '哈', 2, 3, 'A', 'abc', 'def', 'qwer', 123}
删
set1 = {'abc','def',123,'asdas'}set1.remove('abc')print(set1)#运行结果{'asdas', 123, 'def'}# 随机删除一个数set1.pop()print(set1)#运行结果{123, 'def'}# 清空合集set1.clear()print(set1)set()# 删除合集del set1print(set1)#运行结果Traceback (most recent call last):File "C:/Users/mi/PycharmProjects/untitled/1.py", line 118, in <module>print(set1)NameError: name 'set1' is not defined
其他操作
交集(& 或者 intersection)
set1 = {1,2,3,4,5}set2 = {3,4,5,6,7}print(set1 & set2)print(set1.intersection(set2))# 列出两个集合中共同拥有的项
并集(| 或者 union)
set1 = {1,2,3,4,5}set2 = {3,4,5,6,7}print(set1 | set2)print(set2.union(set1))# 列出两个集合中所有的项
差集(- 或者 difference)
set1 = {1,2,3,4,5}set2 = {3,4,5,6,7}print(set1 - set2)print(set1.difference(set2))# 在set1中删除set2中有的项
反交集 (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5}set2 = {3,4,5,6,7}print(set1 ^ set2)print(set1.symmetric_difference(set2))# 显示set1和set2不共存的项
子集与超集
set1 = {1,2,3}set2 = {1,2,3,4,5,6}print(set1 < set2)print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。print(set2 > set1)print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集
不可变集合(frozenset让集合变成不可变类型)
set1 = {1,2,3,4,5,6}s = frozenset(set1)print(s,type(s))s.add(7) # 不可以修改,会报错
流程控制
if

单分支
if条件:满足条件后要执行的代码
双分支
if 条件:满足条件后执行的代码else:if条件不满足执行的代码
if … else …可以有多个分支
if 条件:满足条件执行代码elif 条件:上面的条件不满足就走这个elif 条件:上面的条件不满足就走这个elif 条件:上面的条件不满足就走这个else:上面所有的条件不满足就走这段
while
基本循环
while 条件:循环体
如果条件为真,则循环体执行
如果条件为假,则循环体不执行print('猜数字游戏开始')num = 54while True:guess = int(input("您猜数字是什么?(输入0-100的数字)"))if guess < num:print("您猜小了")continueelif guess > num:print("您猜大了")continuebreakprint("您猜对了!")
运行结果
猜数字游戏开始您猜数字是什么?(输入0-100的数字)50您猜小了您猜数字是什么?(输入0-100的数字)60您猜大了您猜数字是什么?(输入0-100的数字)54您猜对了!
循环终止语句
break
continue
和 break 有点类似,区别在于 continue 只是终止本次循环,接着还执行后面的循环
while … else …
while 后面的 else 作用是指,当 while 循环正常执行完(while的条件为假了),中间没有被 break 中止的话,就会执行 else 后面的语句
其他(for,enumerate,range)
for循环:用户按照顺序循环可迭代对象的内容。
s = '先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。'for i in s:print(i)li = ['甲','乙','丙','丁']for i in li:print(i)dic = {'a':1,'b':2,'c':3}for k,v in dic.items():print(k,v)
enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将
其组成一个索引序列,利用它可以同时获得索引和值。 ```python li = [‘甲’,’乙’,’丙’,’丁’] for i in li: print(i) for i in enumerate(li): print(i) for index,value in enumerate(li): print(index,value) for index,value in enumerate(li,100): #从哪个数字开始索引 print(index,value)
运行结果
甲 乙 丙 丁 (0, ‘甲’) (1, ‘乙’) (2, ‘丙’) (3, ‘丁’) 0 甲 1 乙 2 丙 3 丁 100 甲 101 乙 102 丙 103 丁
range:指定范围,生成指定数字。```pythonfor i in range(1,10):print(i)for i in range(1,10,2): # 步长print(i)for i in range(10,1,-2): # 反向步长print(i)
