python学习笔记 (一)

Python 是强类型的动态脚本语言

好多人对python到底是强语言类型还是弱语言类型存在误解,其实,是否是强类型语言只需要一句话就可以判别,

强类型:不允许不同类型相加。例如:整形+字符串会报类型错误。

动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候。

脚本语言:一般是解释性语言,运行代码只需要一个解释器,不需要编辑。

强弱是对类型而言的。
强类型,你有一个值之后这个值是什么类型是确定,比如n=’1’,n的类型是确定的(字符串),因此你不能在Python做n=’3’ m=n+1运算。而弱类型就不是这样的,值的类型可以在需要的时候再去确定,比如PHP里面你可以$n=’3’; $m=$n+1,运算的时候’3’就可以当作整型来进行计算。

弱类型使用会灵活些,但有时候也会因为这种灵活而带来一些歧义,相比而已,强类型就更严谨了。

理解变量在计算机内存中的表示也非常重要。当我们写:

a = ‘ABC’
时,Python解释器干了两件事情:

在内存中创建了一个’ABC’的字符串;

在内存中创建了一个名为a的变量,并把它指向’ABC’。

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据

python 基本数据类型

数字 字符串 列表 元组 字典 集合

数字 布尔型 :True false

Python的浮点型不区分单精度和双精度

python的浮点型数据在内存中占24个字节

Python原生浮点数类型只有一种,叫float,大小为24个字节(我这里Python3.6是这样,别的版本不清楚),本身就是双精度(你打个特别长的小数,最后它会给你截止到15-16位有效数字,这是双精度浮点数的典型特征),不论你是多短的浮点数都是如此

Python和别的语言不一样,每个变量都是对象,而对象里有各种杂七杂八的属性方法,所以内存占用比其他语言大得多

python序列

• 序列是一块用来存放多个值的连续内存空间。常见的序列有列表、元组、字典和集合。

• 可变与不可变特性

• 可变:列表、字典和集合

• 不可变:元组

• 有序与无序特性

• 有序:列表、元组和字典

• 无序:集合

• 上述序列结构中并不一定要求所有元素都是相同类型的

• 可以利用集合来完成去重处理

• 可以利用字典的哈希特性来完成大数据量的查找和统计的速度
• 列表推导式的功能要重点贯彻

如果希望内存占用更小,而有用单精度的需求,建议使用numpy等第三方库,可以提供对变量类型大小的控制。

数据类型的可变与不可变特性

不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种
数据类型,就称不可变数据类型。

• 可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数
据类型,就称可变数据类型。

• 不可变数据类型: 值相等内存空间地址同

• 数字
• 字符串
• 元组

• 可变数据类型 值相等内存空间地址不同

• 列表
• 字典
• 集合

1
2
3
4
5
import sys
x=[123,12]
y=[123,12]
print(id(x))
print(id(y))

值相等地址空间不同

python循环

1
2
3
4
5
6
7
8
money=int(input("输入"))
coins=(25,10,5,1)
counts=[]
for coin in coins:
counts.append(money//coin)
money%=coin
for i in range(len(counts)):
print("找零{0}美分硬币{1}个".format(coins[i],counts[i]))

python格式化输出

https://www.cnblogs.com/lovejh/p/9201219.html
相对基本格式化输出采用‘%’的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’

使用方法由两种:b.format(a)和format(a,b)。

1
2
1 >>> print('{} {}'.format('hello','world'))  # 不带字段
2 hello world

python格式化字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
格式 描述
%% 百分号标记 #就是输出一个%
%c 字符及其ASCII码
%s 字符串
%d 有符号整数(十进制)
%u 无符号整数(十进制)
%o 无符号整数(八进制)
%x 无符号整数(十六进制)
%X 无符号整数(十六进制大写字符)
%e 浮点数字(科学计数法)
%E 浮点数字(科学计数法,用E代替e)
%f 浮点数字(用小数点符号)
%g 浮点数字(根据值的大小采用%e或%f)
%G 浮点数字(类似于%g)
%p 指针(用十六进制打印值的内存地址)
%n 存储输出字符的数量放进参数列表的下一个变量中


%格式化符也可用于字典,可用%(name)引用字典中的元素进行格式化输出。


负号指时数字应该是左对齐的,“0”告诉Python用前导0填充数字,正号指时数字总是显示它的正负(+,-)符号,即使数字是正数也不例外。


可指定最小的字段宽度,如:"%5d" % 2。也可用句点符指定附加的精度,如:"%.3d" % 3。

e.g.
# 例:数字格式化
nYear = 2018
nMonth = 8
nDay = 18
# 格式化日期 %02d数字转成两位整型缺位填0
print '%04d-%02d-%02d'%(nYear,nMonth,nDay)
>> 2018-08-18 # 输出结果

fValue = 8.123
print '%06.2f'%fValue # 保留宽度为6的2位小数浮点型
>> 008.12 # 输出

print '%d'%10 # 输出十进制
>> 10
print '%o'%10 # 输出八进制
>> 12
print '%02x'%10 # 输出两位十六进制,字母小写空缺补零
>> 0a
print '%04X'%10 # 输出四位十六进制,字母大写空缺补零
>> 000A
print '%.2e'%1.2888 # 以科学计数法输出浮点型保留2位小数
>> 1.29e+00

格式化操作符辅助指令
符号 作用
* 定义宽度或者小数点精度
- 用做左对齐
+ 在正数前面显示加号( + )
<sp> 在正数前面显示空格
# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于
用的是'x'还是'X')
0 显示的数字前面填充‘0’而不是默认的空格
% '%%'输出一个单一的'%'
(var) 映射变量(字典参数)
m.n m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)
```
小数点前面的数字表示最小宽度

数字位数大于它时,按实际位数输出,小数点前空缺也是


小数点后面的数字表示输出的小数点位数,如果位数不足就会四舍五入,如果位数不够显示就会在后面补0.

比如x=12.31913
则printf("%5.3f",x)就是“12.319”,注意小数点也算一位数长!

又如x=2.31913
则printf("%6.3f",x)就是“ 2.319”,注意小数点也算一位数长,2前面还有一个空格!

5.3是指结果总长是最小宽度为五位数(注意小数点也算一位数长),就是小数点前两个数字,不足就用空格表示,小数点后保留两位,不足四舍五入!

关于format方法
![](http://ww1.sinaimg.cn/large/006LSO4Ggy1gdz6p90a10j30me0bot9y.jpg)

print(“float占8位留2位小数:{:8.2f}——默认右对齐”.format(1192.68123))
print(“float占18位留2位小数:{:18.2f}——默认右对齐”.format(1192.68123))
print(“float占18位留2位小数:{:>18.2f}——右对齐”.format(1192.68123))
print(“float占18位留2位小数:{:<18.2f}——左对齐”.format(1192.68123))
print(“float占18位留2位小数:{:^18.2f}——居中对齐”.format(1192.68123))
print(“float留2位小数:{:.2f}——默认右对齐”.format(1192.68123))
print(“float留2位小数:{:>.2f}——右对齐”.format(1192.68123))
print(“float留2位小数:{:<.2f}——左对齐”.format(1192.68123))
print(“float留2位小数:{:<+.2f}——左对齐带符号”.format(1192.68123))
print(“float留2位小数:{:<.2%}——左对齐百分比形式”.format(0.6812345))
print(“int占8位:{:<8d}——左对齐”.format(1192))
print(“int占8位:{:0<8d}——左对齐补0”.format(1192))
print(“int占8位:{:x<8d}——左对齐补x”.format(1192))
print(“int占8位:{:中<8d}——左对齐补中”.format(1192))
print(“int占8位:{:8d}——默认右对齐”.format(1192))
print(“int占8位:{:8d}——默认右对齐”.format(1192))
print(“int占22位:{:22e}——默认右对齐科学计数法”.format(1230000))

`