day2-Python语法基础和进制

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 语句

一条有效代码就是一个语句

    1. 一般情况下一条语句占一行
    1. 一条语句结束不需要分号(如果多条语句要在一行显示,语句之间必须用分号隔开)
    1. 如果一条语句很长,需要多行显示的时候,在换行的时候需要用 \ 连接,不能分割开数据,也可在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 常见数据类型

数据类型是对数据的分类

    1. int(整型) - 所有整数对应的数据类型。 python2.x有 long
    1. float(浮点型) - 所有的小数对应的类型都是浮点型。(浮点型支持科学计数法)
      3e4
      1.2e-2
      print(3e4, 1.2e-2)
    1. str(字符串) - 所有的文本数据对应的数据类型。
    1. bool(布尔) - True 和 False 对应的数据类型
    1. 其他常见类型: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. 正数的原码、反码、补码是一致的;
  2. 负数的补码是反码加1,反码是对原码按位取反,只是最高位(符号位)不变
  3. 计算机数字运算均是基于补码的。

下面就来探讨一下,为啥要用补码来表示数字。

补码好处:

如果计算机内部采用原码来表示数,那么在进行加法和减法运算的时候,需要转化为两个绝对值的加法和减法运算;

计算机既要实现加法器,又要实现减法器,代价有点大,那么可不可以只用一种类型的运算器来实现加和减的远算呢?

很容易想到的就是化减为加,举一个生活中的例子来说明这个问题:

时钟一圈是360度,当然也存在365度,但其实它和5度是一样的;

相同的道理,-30度表示逆时针旋转30度,其与顺时针旋转330度是一样的;

这里数字360表示时钟的一圈,在计算机里类似的概念叫,它可以实现化减为加,本质上是将溢出的部分舍去而不改变结果。

易得,单字节(8位)运算的模为256=2^8。

在没有符号位的情况下,127+2=129,即:

image.png

这时,我们将最高位作为符号位,计算机数字均以补码来表示,则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

image.png

1 0000 1011将溢出位舍去,得0000 1011(二进制)=11。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356