Python 基础语法(查漏补缺)

能力就是拥有分析问题的框架,解决问题的能力

1. 标识符

标识符就是变量、常量、函数、类的名字

命名规定:

  1. 严格区分大小写
  2. 由字母、数字、下划线组成(数字不能开头)
  3. 见名知意
  4. 单词组合:下划线/小驼峰/大驼峰命名法
  5. 变量通常小写,常量全部大写
  6. 不以关键字作为标识符

2. 关键字

# 查看关键字:
import keyword
print(keyword.kwlist)

3. pass语句

pass语句是占位语句,它什么都不做,只是为了保证语法的正确性

使用场景:

  1. 当不知道后面代码怎么写的时候
  2. 当你不需要写代码的细节的时候
  3. 当语法要求必须有语句,但是又没实际内容好写的时候
  4. 其他的你觉得需要的场景

3. 变量

1. 查看内存地址:
a = 1
print(id(a))

3.算数运算符

  • /:除法。得到的商为小数
print(4/2) # 答案为2.0
  • **:取幂
print(2**3) #答案为8
  • //: 取整。若原除数为整数,取商的整数部分(负数向下取整);若原被除数为小数,则先取整数再保留1位小数
print(3//2) # 答案为1
print(5//2) # 答案为2
print(5.0//2) # 答案为2.0
print(5.00//2) # 答案为2.0
print(3.0//2) # 答案为1.0
print(-10//3) # -3.333向下取整(向小的取整)答案为-4
  • %:取余数,注意负数的取余
print(10%3) # 商为3,余数为1,答案为1
print(-10%3) #商为-4(-10//3=-4),余数为:-10-(3*(-4)) = 2,答案为2
  • 同时获得商与余数:
print(divmod(10,3)) # 结果为元组(tuple)类型:(3,1)
  • 解决计算中精度缺失导致显示结果为科学计数法的问题
print(0.1+0.1+0.1-0.3) # 结果为:5.551115123125783e-17
from decimal import Decimal
print(Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')) # 结果为0.0

4. 比较运算符

  • "==" 比较的是运算的值是否相等,不是地址是否相等
print(3.0==3) # 结果为True
  • "<>"在python2中有效,python3中无效

  • ">"或"<"

print(3>2>1) # (3>2) and (2>1) ->True and True->True
print(3>2>2) # (3>2) and (2>2) ->True and False->False
print((3>2)>1)->(3>2) and (1>1)->Ture and False->False
print("bac">"bbb") # 答案是False,因为比较的是字符的ascii值,如果相等就略过,不相等比较一次即可,不会再去比较后面,
  • 元组的比较
print((2,3)>('abc','sss')) # 会报错,首先它会拆分比较,相当于2与'abc'比较,但2与'abc'类型不同,所以需要强转才能比较。
print((3,2)>(2,3)) #答案是True 先3与2比较,直接返回True,不比较后面,和字符串比较类似

5. 逻辑运算符

print(10 and 20)# 答案为20,首先10的布尔值为True,然后20的布尔值为True,所以最后结果为True,值是20
print(10 or 20) # 答案为10,首先10为True,因为or所以不再运行,最后结果为10
print(10 and 0) #答案为0,首先10为True,然后0为False,所以最后结果是False,值是0

6. 位运算

按二进制计算

  • "&" 按位与:两个为1才为1
  • "|" 按位或:一个为1就为1
  • "^" 按异或:(1^0 = 1,0^1 = 1,1^1 = 0,0^0=0)简单理解就是相同为0,不相同为1
  • "~" 取反
  • "<<" 左移
  • "<<" 右移

7. 成员运算符in,not in

in和not in 是python独有的运算符,用于判断对象是否是某个集合的元素之一 ,返回结果为True或False

li = [1,2,3,4]
print(3 in li) # 答案为True
print(5 in li) # 答案为False

8. 身份运算符is

判断两个标识符是否引用自同一个对象(内存地址是否相同)

a = [1]
b = [1]
print(a is b) # 答案为False,因为各自的地址不一样
b = a
print(a is b) # 答案为True,因为把a的地址赋给了b,b和a所指向地址相同

9. 三目运算符

其他语言结构:判断条件?判断为真的结果:判断为假的结果
python结构:判断为真的结果 if 判断条件 else 判断为假的结果

li = [1,2]
print("in" if 1 in li else "not in" ) # 答案为in

10. 整数类型

  1. 进制转化
# 十进制转十六进制
print(hex(11)) # 答案为0xb
# 十进制转八进制
print(oct(11)) # 答案为0o13
# 十进制转二进制
print(bin(11)) # 答案为0b1011
  1. 小整数对象池

python初始化时会自动建立一个小整数对象池,方便调用,避免重复使用。这是一个包含262个指向整数对象的指针数组,范围是-5~256,双闭合区间,比如整数10,即使程序里没创建,但python已经为我们创建了。

这里要注意在交互式解释器和IDLE等运行的差别:

交互式解释器运行.png

a = -5 
b = -5
print (a is b) # 结果为True
a = 256
b = 256
print(a is b) # 结果为True
a = 257
b = 257
print(a is b) # 结果为True

这里的原因简单讲就是由于编译单元不一致:交互式解释器中a=257是一个编译单元,b=257是一个编译单元,结果为False,而IDLE中a=257和b=257处于同一个编译单元,共享常量池,所以结果为True。具体可查看该链接:链接

  1. 复数

用于数学概念计算,很少用到,由实部和虚部构成,单位为j

aa = 4+3j
print(aa) # 结果为:(4+3j)
print(aa.real) # 结果为:4.0
print(aa.imag) # 结果为:3.0

11. 数字类型方法

round()在python3中遵循四舍六入五成双

print(round(4.4)) # 当小于5时,佘4,答案为:4
print(round(4.5)) # 当为5时,前面的数为偶数,佘5,答案为:4
print(round(5.5)) # 当为5时,前面的数为奇数,入1,答案为:6
print(round(4.52)) # 当为5时,且后面还有有效数字,则入1,答案为:5
print(round(4.6)) # 当大于6时,入1,答案为:5

12. 布尔类型

非0数字都为True,非空字符串都为True,列表、元组、字典同样。
None是特殊的值,类型为NoneType,不支持任何运算,也没有内置方法,布尔值永远为False。
简单讲:非空非零的布尔值都为True

print(bool(1)) # 答案为True
print(bool(0)) # 答案为False
print(bool(0.0)) # 答案为False
print(bool("x")) # 答案为True
print(bool("")) # 答案为False

13. 字符串

1. 字符串切片
  • 索引默认从0开始
  • 左闭右开
  • 当取单个字符时,索引超出范围会报错,切片不会报错,例如print("hello"[5:])不会报错,print("hello"[5])会报错
  • 步长不能为0,也不能为浮点数
2. 字符串常见方法
  • int(str) str必须为十进制的数字字符串
# 以下均报错
print(int('a'))
print(int('1.0'))
  • str.find(),查找该字符最低位的索引;str.rfind(),从右往左查,且没找到会返回-1不会报错。而str.index()str.find()效果一样,但没找到会报错
a = 'hello'
print(a.find('l')) # 结果为:2
print(a.rfind('l')) # 结果为:3
print(a.index('l')) # 结果为:2
  • str.replace(要被替换的字符串,替换字符,次数(可写可不写,默认全替换))
- **str.startswith(str1),str.endswith(str2)**判断是否以该字符串开头或结尾

a = 'hello world.txt'
print(a.startswith('he')) # 结果为True
print(a.endswith('.txt')) # 结果为True

a = 'hello'
print(a.replace('l','m')) # 结果为:hemmo
a = 'hello'
print(a.replace('l','m',1))# 结果为:hemlo
  • str.split(),分隔字符串
print('hello world'.split(' ')) # 结果为:['hello', 'world']
  • str.upper(),str.lower
a = 'Hello'
print(a.upper()) # 结果为:HELLO
print(a.lower()) # 结果为: hello
  • str.strip():去字符串或者字符数组头尾的空格
print('  hello world  '.strip()) # 结果为:hello world
  • str.isalpha():判断是否为字母,str.isdigit():判断是否为数字,str.isalnum():判断是否为数字+字母,str是字符或者字符串

  • str.join()用于将序列中的元素以指定的字符连接成一个新的字符串,该序列的元素一定是字符或字符串,像数字并非可迭代对象

a = ['1','2','3','4']
print(''.join(a)) # 结果为:1234
print('-'.join(a)) # 结果为:1-2-3-4
3. 字符串格式化
  1. 通过%占位符:操作繁琐,有一定兼容性问题,不建议使用
  1. %s string 字符串
  2. %d decimal 十进制
  3. %f float 浮点
  4. %.2f 保留两位小数
  5. %o oct 八进制
  6. %x hex 十六进制
name = 'x'
age = 18
sex = 'female'
print("name:%s,age:%d,sex:%s"%(name,age,sex))
  1. format():对字典格式有一定问题
name = 'x'
age = 18
sex = 'female'
print("name:{},age:{},sex:{}".format(name,age,sex))

a = 'x'
b = 0
print("{1} is {0}".format(b,a)) # 结果为:x is 0
  1. f'',python3.6.4版本以上支持,推荐使用
a = 'x'
b = 0
print(f'{a} is {b}') # 结果为 x is 0

14. list列表

1. 创建列表

创建列表有两种方式,注意区别:

a = list('123')
print(a) # 结果为:['1', '2', '3']
b = ['1','2','3']
print(b) # 结果为:['1', '2', '3']
2. 列表及其元素删除
a = ['1','2','3']
del a[1]
print(a) # 结果为:['1', '3']
del a
print(a) # 报错,说明列表删除成功,a此时未定义

a = ['1','2','3']
a.remove('2')
print(a) # 结果为:['1', '3']
a.pop() # 参数为下标,可填可不填,不填默认出栈最后一个元素
a.remove()
print(a) # 报错,需要提供精确的参数,说明该方法无法删除整个列表,只能一个一个元素删除
3. 列表的组合
a = ['1','2','3']
b = ['4',1]
print(a+b) # 结果为:['1', '2', '3', '4', 1]
4. 列表的乘法
a = ['1','2','3']
print(a*3) # 结果为: ['1', '2', '3', '1', '2', '3', '1', '2', '3']
5. 判断元素是否在列表内部
a = ['1','2','3']
print('1' in a) # 结果为:True
6. 迭代列表元素
a = ['1','2','3']
for i in a:
    print(i,end='') # 结果为:123
7. 列表添加元素

append()和extend(),注意extend()只能添加可迭代对象

a = [1,2,3]
a.append(1)
a.append([4,5])
a.extend("5678")
a.extend([2,4])
print(a) # 结果为:[1, 2, 3, 1, [4, 5], '5', '6', '7', '8', 2, 4]
a.extend(2) # 报错:'int' object is not iterable
8. 列表插入元素

在索引前插入元素

a = [1,2,3]
a.insert(1,'c')
print(a) # 结果为:[1, 'c', 2, 3]
8. 清空列表
a = [1,2,3]
a.clear() # 等同于del a[:]
print(a) # 结果为:[]

另外还有reverse(),remove(obj),sort([func]),copy(),index(),count()等列表的内置函数

15. tuple元组

  • tuple的内部无法进行修改(增删改,但是只针对第一级元素),只能查或删除整个元组,但可以通过创建新的变量=原tuple+新tuple达到添加的伪效果,类似于字符串
a = (3,1,4,2)
c = a+(["4",5],)
print(c) # 结果为:(3, 1, 4, 2, ['4', 5])
c[4][0] = 4
print(c) # 结果为:(3, 1, 4, 2, [4, 5])
  • tuple没有内置的sort()和reverse()方法,但可以通过sorted()和list(reversed())
a = (3,1,4,2)
print(sorted(a)) # 结果为:[1, 2, 3, 4]
print(reversed(a)) # 结果为:<reversed object at 0x01B7A178>
print(list(reversed(a))) # 结果为:[1, 2, 3, 4]
  • vs code快速复制一行快捷键:alt+shift+down
  • tuple一级元素不可变,且所占内存较小,list元素可随意变化,但内存占用相比tuple大,应灵活运用
a = (3,4)
b = [3,4]
print(a.__sizeof__()) # 结果为:20
print(b.__sizeof__()) # 结果为:28
  • 将数字列表快速转化为字符串列表
a = [1,2,3,4]
# 先将列表转为字符串再用map转化为map对象,在python2中直接是列表,但在python3需要用list强转
print(map(str,a)) # 结果为:<map object at 0x0329A190>
print(list(map(str,a))) # 结果为:['1', '2', '3', '4']

16. dict字典

1. 三种创建字典的方式:
a = {"name":"小明","age":18}
print(a) # 结果为:{'name': '小明', 'age': 18}
b = dict(name="小明",age=18)
print(b) # 结果为:{'name': '小明', 'age': 18}
c = dict([('name','小明'),('age',18)])
print(c) # 结果为:{'name': '小明', 'age': 18}
2.将列表转化为元组或字典
a = [1,2,3,4]
b = [5,6,7,8]
def fmap(a,b):
    return (a,b)
print(list(map(fmap,a,b))) # 结果为:[(1, 5), (2, 6), (3, 7), (4, 8)]
print(dict(map(fmap,a,b))) # 结果为:{1: 5, 2: 6, 3: 7, 4: 8}
print(dict(zip(a,b))) # 结果为:{1: 5, 2: 6, 3: 7, 4: 8} 
3. 字典获取不存在的key/value的两种方法的返回结果(获取最好用get)
a = {"name":"小明","age":18}
print(a.get("sex")) # 结果为:None
print(a["sex"]) # 报错 KeyError: 'sex'
4. 以字典的value值进行排序
a = {'a':94,'b':89,'c':98}
print(sorted(list(zip(a.values(),a.keys())))) # 结果为:[(89, 'b'), (94, 'a'), (98, 'c')]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354