python学习随笔(一)
学习python之前认识计算机原理更加有效了解编程,下面学习一下计算机体系结构
冯诺依曼体系架构
CPU
运算器#完成各种运算,数据传输等
控制器#控制程序的执行
#CPU中还有寄存器和多级缓存Cache
存储器 #memory内存
IO设备
输入设备
输出设备
程序program:
算法+数据结构=程序
数据结构(决定着算法)
算法:数据处理的方式(解决问题的办法)
Python解释器:
CPython,IPython,PyPy,Jython,IronPython
Python基础语法
注释 #标注的文本
数字
整数,不分区long和int
进制0xa(十六进制),0o10(八进制),0b10(二进制)
bool,2个值Ture,False
浮点数
1.2,3.1415,-0.12,1.46e9等价于1.46*10^9
复数,1+2j
字符串
使用' " 单双引号引用的字符的序列
'''和"""单双三引号,可以跨行,可以在其中自有的使用单双引号
在字符串前面加上r或者R前缀,表示该字符串不做特殊的处理
基础的语法
转义序列
\\ , \t ,\r ,\n \' , \"
前缀r,把里面的所有字符当普通字符对待
缩进
未使用C等语言的花括号,而是采用缩进表示层次关系
约定4个空格缩进
续行
在尾行使用 \
如果使用各种括号,认为括号内是一个整体,内部跨行不用 \
基础语法
标识符
1. 一个名字,用来指代一个值
2. 只能是字母、下划线和数字
3. 只能以字母或下划线开头(最好只用小写大写和下划线以后有别的用处)
4. 不能是python的关键字,例如def、class就不能作为标识符
5. Python是大小写敏感的
常量
#python中无法定义常量
# 一旦赋值就不能改变值的标识符
字面常量
一个单独的量,例如 12、"abc" 、'2341356514.03e-9'
变量
赋值后,可以改变值的标识符
Python的语言类型:动态编译型语言,强类型语言
静态语言和动态语言对比
静态编译语言
实现声明变量类型,类型不能再改变
编译时检查
动态编译语言
不用事先声明类型,随时可以赋值为其他类型
编程时不知道是什么类型,很难推断
强类型语言和弱类型语言对比
强类型语言
不同类型之间操作,必须先强制类型转换为同一类型。print('a'+1)
弱类型语言
不同类型间可以操作,自动隐式转换,JavaScript中console.log(1+'a')
运算符Operator
算数运算符
+ - * / % **
自然除/结果是浮点数,整除//。(注:2.x中/和//都是整除)
位运算符
& #位与
| #位或
~ #取反
^ #异或
<< #向左移位
>> #向右移位
常用方式:乘除2的倍数,32 // 8相当于 32 >> 3(8是2^3可以写成右移三位)
12,0xc,0o14,0b1100
原码,反码,补码,负数表示法
计算机看到是补码转换成原码给我们看
原码
5 => 0b101,1 => 0b1 ,-1 => -0b1, bin(-1)#python中的表示方法
反码
正数的反码与原码相同;负数的反码符号位不变其余按位取反
补码
正数的补码与原码相同;负数的补码符号位不变其余按位取反后+1
补码的补码是原码
例: -1的原码是1000 0001 反码是1111 1110 补码是1111 1111(反码加1)
5-1=5+(-1) 直觉上是0b101-0b1,其实是0b101+0b11111111,溢出位舍弃
~12等于多少,为什么 -13 12原码0000 1100 补码是1111 0011 (最高位是1是负数)取反1000 1100
运算符
比较运算符
==(相等) !=(不等) > < >= <=
返回一个bool值
1 < '1' 1 == '1'
链式比较操作符
4>3>2 4>mynumber >=1
逻辑运算符
与或非 and or not
短路运算符 #能短路就不用往下计算了尽量使用短路法
and 如果第一个表达式为False,后面就没有必要计算了,这个逻辑表达式一定是False
or 如果第一个表达式True,后面没有必要计算了,这个逻辑表达式一定是True
赋值运算符
a = min(3, 5)
+= -= *= /= %= 等
x = y = z = 10
成员运算符
in、not in
身份运算符
is 、is not
运算符优先级
算数运算符 > 位运算符> 身份运算符 > 成员运算符 > 逻辑运算符
记不住,用括号
长表达式,多用括号,易懂、易读
表达式Expression
由数字、符号、括号、变量等的组合
算数表达式
逻辑表达式
赋值表达式
Python中,赋值即定义,如果一个变量已经定义,赋值相当于重新定义
内存管理:
当对象引用变数为0,它就可以被垃圾回收GC
内存整理:
常用的在做内侧,不常用的在边上
程序控制:
顺序,分支,循环
单分支结构:
if语句
if condition(bool函数)
代码块
condition必须是一个bool类型,这个地方有一个隐式转换bool(condition)
if 1<2:
print('1 less than 2')
代码块
类似于if语句的冒号后面的就是一个语句块
在if、for、def、class等关键字后使用代码块
#False等价布尔值(仅限python)
False等价布尔值,相当于bool(value)
空集合
空字符串
空字典
空列表
空元祖
None对象
0
多分支结构:
if,elif,else
只要有一个分支进入其他分支不再进入
else可以没有,只要有else就可以匹配到
if...elif...else语句
if condition1:
代码块1
elif condition2:
代码块2
elif condition3:
代码块3
......
else:
代码块
例:
a = 5
if a<0:
print('negative')
elif a==0:
print('zero')
else:
print('positive')
分支嵌套:
else里可以嵌套if
例:
score = 80
if score<0:
print('wrong')
else:
if score==0:
print('egg')
elif score <= 100:
print('right')
else:
print('too big')
折半查找 ##fold
例题:
给定一个不超过5位的正整数,判断其有几位,使用input函数
a = input('>>>')
a = int(a)
if a >= 1000: #fold
if a>=10000:
print(5)
else:
print(4)
else:
if a>=100:
print(3)
elif a >= 10:
print(2)
else:
print(1)
循环——while语句
语法
while condition: ##循环条件等效于True进来为False进不来
block
当条件满足即condition为True,进入循环体,执行block
举例
flag=10
while flag:
flag -= 1
print(flag)
循环——for语句*(重点)
语法
for element in iteratable: #iteratable(可迭代对象),可迭代对象没东西,不执行
block
当可迭代对象中有元素可以迭代,进入循环体,执行block
range函数 #range后是一个可迭代对象
例:
range(1,5) #[1,5)前包后不包,是一个range对象
for x in range(10)
print (x) #打印0-9
循环 continue语句 #中断当前循环的当次执行,继续下一次循环
举例:计算10以内的偶数(for循环)
for i in range(10):
if not i%2: #i%2偶数时是0,not 0就是ture打印
print(i)
for i in range(0,10,2): # 减少迭代次数,#range后面的是步长可以为负是反向
print(i)
for i in range(0,10): # 使用位与
if i & 1:
continue
print(i)
循环 break语句 # 终止当前循环
举例:计算1000以内的被7整除的前20个数(for循环)
count = 0
for i in range(0,1000,7):
print(i)
count += 1
if count >= 20:
break
循环 continue、break语句总结
continue和break是循环的控制语句,只影响当前循环,包括while、for循环
如果循环嵌套, continue和break也只影响语句所在的那一层循环
continue和break 不是跳出语句块,所以 if cond: break 不是跳出if,而是终止if外的break所
在的循环
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
续上内容
#当碰到第一个为非零时后面的数都行
divmod函数
divmod(x,y,/) #连整除带取模
循环else子句
语法
while condition:
block
else:
block
for element in iteratable:
block
else:
block
如果循环正常执行结束就执行else子句;如果break终止,else子句不会执行
#多方位思考问题,培养对称思想很多时候可以减小难度