本文前4章为学习python的辅助章节,简单了解即可,可根据自身情况进行选择学习。
程序:指挥计算机工作的指令序列。
1.计算机如何处理程序?
按照冯·诺依曼存储程序的原理,计算机的工作流程大致如下:
1. 用户打开程序,程序开始执行;
2. 操作系统将程序内容和相关数据送入计算机的内存;
3. CPU根据程序内容从内存中读取指令;
4. CPU分析、处理指令,并为取下一条指令做准备;
5. 取下一条指令并分析、处理,如此重复操作,直至执行完程序中全部指令,最后将计算的结果放入指令指定的存储器地址中。
2、计算机语言三代
1.机器语言——计算机最早的语言形式,直接使用二进制代码表示,由0和1组成的序列构成,计算机能够直接识别和执行这些指令。
优点:计算机直接识别并处理,运行速度最快。
缺点:非常底层且难以理解和记忆。
2.汇编语言——使用助记符来表示机器指令,这些助记符更接近人类语言,使得编程变得更加直观和易于理解。
优点:一定程度上解决了机器语言的缺点。
缺点:低级语言编写效率低,依赖于硬件。
3.高级语言——使用人类日常语言编写。
优点:易于理解与阅读,不依赖于硬件可以执行高,开发效率高。
缺点:执行速度最慢,占用空间多。
3、高级语言分类
- 按实现方式:分为编译型语言和解释型语言。
编译型语言:C、C++,需要先将源代码编译成机器码再执行,开发效率低,执行效率高。
解释型语言:Python、JavaScript,则在运行时由解释器逐行解释执行,开发效率高,执行效率低。
- 按编程方式:可以分为面向对象语言、面向过程(函数式)语言等。
面向对象语言如: Java、C++,支持封装、继承和多态等概念;
面向过程(函数式)语言如: C,以函数为主要构成单元,强调无副作用和不可变性。
4、机器语言中的二进制
4.1 什么是进制
人为规定符合某种规则的计数方式
规则:X进制——逢X进一、借一当X
计算机中的进制:2进制、8进制、16进制
(1)计算机为什么采用2进制?
计算简单,电路易于实现
4.2 进制的三要素
进制 | 数码 | 基数 | 位权 |
十进制 | 0 1 2 3 4 5 6 7 8 9 | 10 | .......10^2 10^1 10^0 10^-1 10^-2 10^-3..... |
二进制 | 0 1 | 2 | .......2^2 2^1 2^0 2^-1 2^-2 2^-3..... |
八进制 | 0 1 2 3 4 5 6 7 | 8 | .......8^2 8^1 8^0 8^-1 8^-2 8^-3..... |
十六进制 | 0 1 2 3 4 5 6 7 8 9 a b c d e f | 16 | .......16^2 16^1 16^0 16^-1 16^-2 16^-3..... |
4.3 进制的表示方式
进制 | 前缀法 | 后缀法 (易识别错误,不选用) |
十进制(decimalism) | 1234 | 1234D 1234 |
二进制(binary ) | 0b110 0B110 | 110B |
八进制(octonary) | 0o1234 0O1234 | 1234O |
十六进制(hexadecimal) | 0x1234 0X1234 | 1234H |
4.4 进制的转换
4.4.1 十进制转N进制
方法1:除N取余,逆向排列
例如:25转二进制:25 = 0b11001
25转八进制:25 = 0o31
方法2:位权展开相减法
方法3:python内置函数
#十进制输出
print(1234)
# 十转二
print(bin(1234))
#十转八
print(oct(25))
#十转16
print(hex(25))
4.4.2 N进制转十进制
方法:位权展开相加法
例如 :1010 转为 十进制为 10
4.4.3 二进制与八进制转换
二进制 转 八进制 三合一
八进制 转 二进制 一拆三
例如:
0b110110110 = 0b110 110 110 = 0o666 (2^2+2^1 =4+2=6)
0o567 = 0b101 110 111 (5=2^2+2^0 6=……)
4.4.4 二进制与十六进制转换
二进制 转 十六进制 四合一
十六进制 转 二进制 一拆四
例如:
0b 1 1011 0110 = 0x1b6 (不足4位,在高位补0)
0xabc = 0b1010 1011 1100
a=10=2^3+2^1 =ob1010 b=11=2^3+2^1+2^0 c=12=2^3+2^2
4.6 二进制的原码 反码 补码
数据在存储的时候,有正数也有负数,就涉及到原码、反码、补码,因为计算机中的数据计算都是以【补码】形式参与的。
原码:给人看的,直接转换得到的
反码:用来做原码与补码之间转换的中间者
补码:给计算机看的
正数:原码 = 反码 = 补码 = 自身二进制
负数:
原码:最高位代表符号位【0正1负】,其他位是自身二进制
反码:最高位代表符号位【0正1负】,其他位对原码按位取反【0变1 1变0】
补码:最高位代表符号位【0正1负】,其他位对反码加1
1. 题目描述: 写出下面数值的原码、反码、补码(要求采用16位来表示)
1) -127的原码 1000 0000 0111 1111
2) -127的反码 1111 1111 1000 0000
3) -127的补码 1111 1111 1000 0001
2. 按照计算机的加法器,计算3-5,演示过程
题目分析,按照计算机加法器算,所以先将3-5转换成3 + (-5)
又因为计算机中数值计算都是以【补码】形式参与的,所以计算3和-5的补码
如下所示:【以8位二进制为例】
3 0000 0011 =》 0000 0011 =》 0000 0011
-5 1000 0101 =》 1111 1010 =》 1111 1011
补码相加,进行计算
0000 0011 【补码】
+ 1111 1011 【补码】
——————————————
1111 1110 【补码】
1111 1101 【反码】
1000 0010 【原码】 -2
5、认识python
- 发明人:吉多·范罗苏姆
- 时间:1990年初开始设计,1991年发布第一版本
- 语言类型:面向对象的、解释型的高级语言
- 显著特点:强调代码的简洁性和可读性,追求最少的代码来实现功能
交换两个数:c=a, a=b, b=c; a=a+b, b=a-b, a=a-b; 位运算
python中:a,b = b,a
5. 用途:自动化运维/办公、web开发、爬虫、大数据、云计算、人工智能....
6.优点:开源、免费、简单、易学、丰富的库【自带的库和第三方库】可移植性高、跨平台性好
7.缺点:因为是解释型语言所以执行速度慢
6、python的基础语法
6.1 行
不以分号结尾,独立的一行就是一行python语句,
若语句过长可以回车换行或者使用 续行符 \ 进行分割
6.2 缩进
【Tab键或者4个空格,但是一定要统一】
C语言中我们使用 { } 来表示代码段
python语言中使用缩进来表示 代码段
合理的缩进就很重要
print("第一章")
print("第一小节")
IndentationError: unexpected indent
if 1:
print("第一章")
IndentationError:
expected an indented block after 'if' statement on line 1
if 1:
print("我是层级1的执行语句")
if 2:
print("我是层级2的执行语句")
if 3:
print("我是层级3的执行语句")
print("我也是层级2的执行语句")
print("我也是层级1的执行语句")
6.3 注释
——起解释说明作用,解释器会自动忽略这部分内容
注释作用 解释说明 增加可读性
单行注释 # 注释语句 【注意 #和注释语句之间建议使用1个空格隔开】
快捷键是:ctrl + /
多行注释 以三个单引号或三个双引号括起来,一般多用于函数、类、文档的说明
# 下面是例子
def fun():
'''
这里定义了一个函数
函数名是:fun
:return: 还没想好
功能:也没想好
'''
pass
class Person:
"""
这里定义了以个person类
类属性是:...
类方法是:...
"""
pass
6.4 变量
python中的变量,不需要声明数据类型,根据所赋的值确定类型
变量:在程序运行过程中可以修改的量
变量定义的语法格式:变量名 = 赋值/数据
变量的数据类型:数值Number 字符串String 列表List 元组Tuple 集合Set 字典Dict
变量三要素:id 内存地址 value 值 type 类型
6.5 标识符
用于给变量、函数、类、对象等命名的符号
标识符必须符合一定的规范:
1》由字母、数字、下划线组成,严格区分大小写
2》不能以数字开头
3》不能包含关键字
4》建议使用驼峰命名法、连字符法,见名识意
驼峰命名法:MyFunName
连字符法:my_name
6.6 关键字
python中预先保留的一些具有特殊含义的单词,不能作为标识符。
关键字有这些特征:
预定义:python内置,无需外部导入
不可变:不可以重新定义或者修改
可以通过导入外部keyword库查看关键字列表
# 使用关键字import导入外部keyword关键字库
import keyword
# 调用kwlist显示所有的关键字
print(keyword.kwlist)
# 使用内置函数len可以查看关键字的个数
print(len(keyword.kwlist))
# 调用iskeyword判断你设置的标识符是不是关键字
print(keyword.iskeyword('for'))
print(keyword.iskeyword('end'))
7、数据类型【先了解】
7.1 数值型 Number
- int 整数 正整数、负整数、0【区别:可以处理极大极小数】
- float 小数、浮点数、实数 因为小数点可以移动,所以称之为浮点数
- complex 复数 由实部和虚部两部分组成 3j 3+4j
- bool 布尔值 只有两个值True 和 False【注意:首字母必须大写】
int_a = 13
print(type(int_a))
float_a = 13.14
print(type(float_a))
complex_a = 3 + 4j
print(type(complex_a))
bool_a = True
print(type(bool_a))
7.2 字符串 string
字符串就是一系列文本,使用单引号或者双引号括起来,同时可以使用 \ 进行转义字符的处理。
注意:
单引号和双引号只是字符串的标志,不是内容。
例如:"hello",这里面包含5个字符 h e l l o。
若想把单引号 双引号当作内容,如何处理呢?
使用转义字符,因为解释器、浏览器、编译器有时候不解析某些特殊符号,我们就需要使用 \ 对这些特殊符号进行转义说明。
\' 单引号 \" 双引号 \t tab制表符位
\n 回车换行 \a \b \r \\等等等
双引号中可以包含单引号
单引号中可以包含双引号
单引号中不能包含单引号
双引号中不能包含双引号
7.3 列表 list
一组数据放在 [ ] 里面,元素之间使用逗号隔开
list_a = [1, 2, 3, 4, 5]
print(type(list_a))
print(list_a)
7.4 元组 tuple
tuple_a = (1, 2, 3, 4, 5)
print(type(tuple_a))
print(tuple_a)
7.5 字典 dict
是一种映射类型,可以进行索引查看,由键值对组成
放在{ }里面,键值对用:相连,多个键值对用逗号分割
dict_a = {'人字旁':('们', '亿'), '双人旁':('徐', '行')}
print(type(dict_a))
print(dict_a)
7.6集合 set
一组数据放在 { } 里面,元素之间使用逗号隔开
set_a = {1, 2, 3, 4, 5}
print(type(set_a))
print(set_a)
8、运算符
8.1 基本运算符
算术运算符 | 加 + 减 - 乘 * 除 / 商 // 余(模运算) % 乘方 ** | 混合运算时,遵循优先级 ** 高于 * / // % 高于 + - 若记不住,直接加() |
赋值运算符 | 简单赋值 = 复合赋值运算 += -= *= /= //= %= **= | 复合赋值运算,先运算再赋值 例如: a = 12 print(a) a += 12 print(a) |
比较运算符 | 大于> 小于 等于 == 大于等于 >= 小于等于 不等于 != | 比较运算符的比较结果是布尔值,两个值 True 和 False |
逻辑运算符 | 逻辑与 and 逻辑或 or 逻辑非 not | 逻辑与:全真为真、遇假则假 逻辑或:全假为假、有真即真 逻辑非:非真即假、非假即真 逻辑运算的结果是布尔值,有两个:True 和 False |
位运算符 二进制 | 位与 &
位或 | 异或 ^ 取反 ~ 左移 右移 >> | 1&0=0 1&1 = 1 0&1 = 0 位与 全1为1 有0则0 1|0=1 0|1=1 0|0=0 1|1=1 位或 全0为0 有1则1 1^0=1 0^1=1 1^1=0 0^0=0 异或 相同为0 不同为1 ~1=0 ~0=1 110110 110110>>2 = 00 1101 (正数右移,左侧补0;负数右移,左侧补1) 110110<<2=0110 00 |
问:
a = 12, 执行完 a += a*a 后,a的值是( )
i = 10, j = 10, k = 3; k*=i+j; k = ( )
# k= k * (i+j)=60
#####################################################
问:
有一个数num,如何判断它是偶数?
分析:偶数 能被2整除的数,什么是整除呢?——余数为0是整除
再分析:怎么知道余数为0呢?使用 %
num % 2 == 0
有一个数num,如何判断它是奇数?
num % 2 != 0
有一个数num,如何判断它是5的倍数?
num % 5 == 0
有一个三位数num,如何判断它是水仙花数?
153 = 1*1*1 + 5*5*5 + 3*3*3 是水仙花数
个位**3 + 十位**3 + 百位**3 == num
如何求个位十位百位呢?——十进制转十进制,除10取余,逆向排列
num = 153
g = num % 10
s = num // 10 % 10
b = num // 100 % 10
print(g, s, b)
#####################################################
问:
x = 2, y = 3, z = 4; 则表达式 x + (y > z)的值为(2 )
x = 2, y = 3, z = 4; 则表达式 x + (y > (not z))的值为(3 )
需要明白:在逻辑判断中,除了0和0.0之外其余均是真
而真True转换成int是1 假False转换成int是0
如何判断一个数num,能被3或5整除,但是不能被7整除?
(num%3==0 or num%5==0) and num%7!=0
如何判断一个数num,是一个三位数?
100<=num<=999
num>=100 and num<=999
num>99 and num<1000
如何判断一个年份year是闰年?[四年一闰百年不闰、四百年再闰]
(year%4==0 and year%100!=0) or year%400==0
如何判断一个年份year是平年?
not ((year%4==0 and year%100!=0) or year%400==0)
#####################################################
位运算符:先换算成二进制,以【补码】形式参与运算
print(25 & 13)
print(3 & -3)
print(3 | -3)
print(~(-3))
print(3 ^ -3)
print(3 << 1)
print(3 >> 1)
print(-3 << 2)
print(-3 >> 2)
注意:
对于左移来说,低位补0
对于右移来说,正数高位补0,负数高位补1
8.2 运算符的优先级
() | 圆括号内的表达式拥有最高优先级 |
** | 乘方运算 |
*、/、%、// | 算术运算符,先乘除 |
+、- | 算数运算符,后加减 |
> | 位运算符的左移与右移 |
& | 位运算符的按位与 |
^ | 位运算符的按位异或 |
| | 位运算符的按位或 |
> 、=、 | 比较运算符 |
and、or | 逻辑运算符 |
=、+=等 | 赋值运算符优先级最低 |