1.快捷键
全选Ctrl + A
复制Ctrl + C
粘贴Ctrl + V
剪切Ctrl + X
保存Ctrl + S
注释和撤销注释Ctrl + /
撤销Ctrl + Z - 撤销
反撤销Ctrl + Shift + Z
鼠标点击 + Shift(不放) - 选中部分
鼠标点击 + option/alt(不放) - 创建多个光标
快速导入模块Alt+Enter
快速格式化代码 (加空格)Ctrl+Alt+L
上下移动一行代码Shift+Alt+↑/↓
上下移动代码块Ctrl+Shift+↑/↓
快速复制并粘贴代码Ctrl+
缩进Tab
减少缩进Tab+Shift
光标最左边Home / Fn+ ←苹果 / Command + ←
光标最右边End / Fn+ → 苹果/ Command + →
Alt+Shift+F10执行
删除当前行Ctrl + Y
快速换行Shift+Enter
展开/折叠全部代码块Ctrl + Shift +/-
转到方法定义Ctrl + B/鼠标左键
选中增加的代码Ctrl + W 块
方法或变量重命名Shift + F6
2.基础语法
2.1 注释
程序中不参与编译执行(不参与解释),也不影响程序功能的说明性的文字就是注释
2.1.1 单行注释
在说明性文字前加 # (# 后面的文字就是注释)
print('hello world!') # 这个是打印语句
2.1.2 多行注释
将说明性文字放在''' '''或者 """ """之间
'''
多行注释第一行
多行注释第二行
...
'''
"""
多行注释1
多行注释2
...
"""
2.2 语句
一条有效代码就是一个语句
- 一般情况下一条语句占一行
- 一条语句结束不需要分号(如果多条语句要在一行显示,语句之间必须用分号隔开)
- 如果一条语句很长,需要多行显示的时候,在换行的时候需要用 \ 连接,不能分割开数据,也可在Pycharm设置自动换行
print('abc')
print('张三')
result = 1982393 + 2792379 - 29739 + \
23791738712 * 2323 / 283676 + \
23648126 - 2634786128
print(result)
2.3 缩进
python是通过缩进和冒号来产生代码块的,表示一种从属关系,在没有块语法的时候不能随便在代码中添加缩进
print('第一行')
print('第二行')
if True:
print('abc')
2.4标识符和关键字
2.4.1 标识符 - 用来给变量、函数、类取名用的
- python中标识符的要求:1)由字母、数字或者下划线()组成 2)数字开头
注意: python3.x中标识中可以出现中文,但是实际开发的时候不能这么做 - _合法的标识符: L40, 40, a_b10, abc12,
- 不合法:40L, abc+123, abc.123
2.4.2 关键字
有特殊功能或者特殊意义的一部分标识符就是关键字。(对于特定的语言来说关键字有哪些,每个关键字的意义和功能是固定的)
import keyword # 导入 keyword 模块
print(keyword.kwlist) # 打印所有关键字
2.5 常用的数据
2.5.1 数字数据: 用来表示大小的数据才是数字数据,数字数据在程序中表示的时候直接写
789
100
13.78
-789
+780
2.5.2 文本数据:用文字信息描述的数据就是文本数据,文本数据在程序中表示的时候需要放在单引号或者双引号中
# '重庆开县'
print(123)
print('123')
2.5.3 布尔值:只有 True 和 False 两个值的数据,通常用来表示 真 和 假。
# True
# False
2.6 常见数据类型
数据类型是对数据的分类
- int(整型) - 所有整数对应的数据类型。 python2.x有 long
- float(浮点型) - 所有的小数对应的类型都是浮点型。(浮点型支持科学计数法)
3e4
1.2e-2
print(3e4, 1.2e-2)
- float(浮点型) - 所有的小数对应的类型都是浮点型。(浮点型支持科学计数法)
- str(字符串) - 所有的文本数据对应的数据类型。
- bool(布尔) - True 和 False 对应的数据类型
- 其他常见类型:list(列表)、tuple(元组)、dict(字典)、迭代器、生成器、函数、自定义类型...
3.输入和输出函数
## 3.1 输出函数 - print
用法一:print(数据) - 在控制台打印指定数据(打印结束后会自动换行)
```python
print('hello world!')
print(110)
print(True)
print("你好!")
print('====================================')
用法二:print(数据1, 数据2, 数据3, ...) - 在控制台的一行打印多个数据,数据之间用空格隔开,所有数据打印结束后换行
print('你好', 100, False)
print('====================================')
方法三:print(数据1, 数据2, ..., end=文本数据) - end用于设定多个print语句之间的连接文本,默认是换行符。在控制台的一行打印多个数据,数据之间用空格隔开,所有数据打印结束后打印指定的文本数据(不会换行)
print('hello world!', end=' ')
print('====================================')
方法四:print(数据1, 数据2, 数据3,..., sep=文本数据) sep用于设定同一个print语句中要打印的多个数据之间的连接文本
print(10, 20, 30, 40, sep='加上', end='等于')
print(120)
3.2 输入函数 - input
- 用法: 变量 = input(输入提示信息) - 用变量获取输入提示信息后输入的内容(输入的时候按回车结束)
- 注意: 不管输入的内容是什么,变量获取到的数据的类型都是字符串
tel = input('请输入手机号:')
print(tel)
4.进制
# 数字在计算机中表现的方式常见的有四种:十进制、二进制、八进制、十六进制
# 1. 十进制
# 1)基数:0,1,2,3,4,5,6,7,8,9
# 2)进位:逢10进1
# 3)位权:10的n次方 (n从低位到高位从0开始依次增加)
# 1231 = 1*10^3 + 2*10^2 + 3*10^1 + 1*10^0
# 4)程序中的表示方式:直接写
123
100
# 2. 二进制
# 1)基数:0,1
# 2)进位:逢2进1
"""
11011 + 10111 = 110010
1011 + 111010 = 1000101
"""
# 3)位权:2的n次方 (n从低位到高位从0开始依次增加)
# 101011 = 2^5 + 2^3 + + 2^1 + 2^0 = 32 + 8 + 2 + 1 = 43
# 4)程序中的表示方式:二进制数前加 0b或者0B
0b101
0B1010011
# 0b102 # 错误写法
# 3. 八进制
# 1)基数:0,1,2,3,4,5,6,7
# 2)进位:逢8进1
"""
76 + 45 = 143 6+5-8=3 进3 7+4+3=14
"""
# 3)位权:8的n次方 (n从低位到高位从0开始依次增加)
# 123 = 1*8^2 + 2*8^1 + 3*8^0 = 64 + 16 + 3 = 83
# 4)程序中的表示方式:八进制数前加 0o或者0O
0o10
0O27
# 4. 十六进制
# 1)基数:0,1,2,3,4,5,6,7,8,9,a/A,b/B, c/C, d/D, e/E, f/F
# 2)进位:逢16进1
"""
9 + 6 = F
7 + 9 = 10
"""
# 3)位权:16的n次方 (n从低位到高位从0开始依次增加)
# 123 = 16^2 + 2*16^1 + 3*16^0 == 256 + 32 + 3 = 291
# 4)程序中的表示方式:十六进制数前加 0x或者0X
0x9afdab
0x8AabF1
# 注意:十进制数能做的事情其他的进制数都可以做
print(291 + 1)
print(0x123 + 1)
5.进制转换
# 1. 其他进制转十进制,用int(数据)
# 手动转换: 每一位上的数乘以位权再求和
"""
0b1011 -> 2^0 + 2^1 + 2^3 = 1 + 2 + 8 = 11
0o12 -> 2*8^0 + 1*8^1 = 10
0xaf -> 15*16^0 + 10*16^1 = 175
"""
# 使用代码:直接用print函数打印
print(0b1011) # 11
print(0o12) # 10
print(0xaf) # 175
# 2. 十进制转其他进制
# 手动转换:辗转取余法
"""
100 -> 0b1100100
100 -> 0o144
100 -> 0x64
"""
print(0b1100100, 0o144, 0x64) # 100
# 3.八进制、十六进制与二进制之间的相互转换:
"""
八进制转二进制: 将1位8进制数转换成3位的二进制
十六进制转二进制: 将1位16进制数转换成4位的二进制
0o67 -> 0b110 111
0o624 -> 0b110 010 100
0xaf -> 0b1010 1111
0xf21 -> 0b1111 0010 0001
0xa8e4 -> 0b1010 1000 1110 0100
二进制转八进制:将3位的2进制数转换成1位的8进制
二进制转十六进制:将4位的2进制数转换成1位的16进制
0b011 010 111 011 -> 0o3273
0b0110 1011 1011 -> 0x6bb
"""
# 4. 代码转换
# 1)bin(数字) -> 将其他数字转换成二进制
# 2) oct(数字) -> 将其他数字转换成八进制
# 3) hex(数字) -> 将其他数字转换成16进制
print(bin(0o67))
print(hex(100))
6.原码反码补码
# 计算机存储数据的时候存的是数字的补码
# 内存大小:
"""
位(bit)
字节(Byte): 1字节 == 8位
1 B(Byte) = 8 b (bit)
1 KB = 1024 B (Byte)
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
1 PB = 1024 TB
1 EB = 1024 PB
1 ZB = 1024 EB
1 YB = 1024 ZB
1 BB = 1024 YB
程序员编程能操作的内存的最小单位是字节:malloc(字节)
"""
# 正数的原码、反码和补码一样
# 1. 原码
# 最高位为符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制表示。
# 原码 = 符号位+真值
# 符号位:最高位表示符号位(0表示正,1表示负)
# 真值:数字的绝对值的二进制
# 10的原码:00001010
# -256的原码:10000001 00000000
# 56的原码:00111000
print(0b10101011)
# 2.负数的反码 - 原码符号位不变其余位取反。
# -10的反码:11110101
# -3的反码:10000011(原) -> 11111100(反)
# -2的反码:10000010(原) -> 11111101(反)
# 3.负数的补码 - 反码加1
# 计算机在存储和操作数据的时候使用的是原码,查看结果的时候用原码
# -2的补码:11111110
# -3的补码:11111101
"""
计算机在对负数进行加法运算的时候结果不对,需要通过补码进行运算(计算机没有减法器只有加法器)
3 - 2 = 1
00000011(原) + 10000010(原) = 10000101(原码) -> -5(错)
00000011(补) + 11111110(补) = 000000001(补) -> 000000001(原) -> 1(对)
"""
总结:
- 正数的原码、反码、补码是一致的;
- 负数的补码是反码加1,反码是对原码按位取反,只是最高位(符号位)不变;
- 计算机数字运算均是基于补码的。
下面就来探讨一下,为啥要用补码来表示数字。
补码好处:
如果计算机内部采用原码来表示数,那么在进行加法和减法运算的时候,需要转化为两个绝对值的加法和减法运算;
计算机既要实现加法器,又要实现减法器,代价有点大,那么可不可以只用一种类型的运算器来实现加和减的远算呢?
很容易想到的就是化减为加,举一个生活中的例子来说明这个问题:
时钟一圈是360度,当然也存在365度,但其实它和5度是一样的;
相同的道理,-30度表示逆时针旋转30度,其与顺时针旋转330度是一样的;
这里数字360表示时钟的一圈,在计算机里类似的概念叫模,它可以实现化减为加,本质上是将溢出的部分舍去而不改变结果。
易得,单字节(8位)运算的模为256=2^8。
在没有符号位的情况下,127+2=129,即:
这时,我们将最高位作为符号位,计算机数字均以补码来表示,则1000 0001的原码为减1后按位取反得1111 1111,也就是-127。
也就是说,计算机里的129即表示-127,相当于模256为一圈,顺时针的129则和逆时针127即-127是一样的。
故可以得到以下结论:
负数的补码为模减去该数的绝对值。
如-5的补码为:
-5=256-5=251=1111 1011(二进制)
同样的,临界值-128也可以表示出来:
-128=256-128=128=1000 0000(二进制)
但是正128就会溢出了,故单字节(8位)表示的数字范围为-128--127。
最后,我们来看一下,补码是如何通过模的溢出舍弃操作来完成化减为加的!
16-5=16+(-5)=11
1 0000 1011将溢出位舍去,得0000 1011(二进制)=11。