无痛速记python基础
《天才玩家M扫荡python关卡》(自用)之第一章
提示:本人python目前知识大多是学自廖雪峰老师,respect
第一章 Python基础
数据类型和变量
在Python中,能够直接处理的数据类型有以下几种:
整数:
顾名思义就是数学上的整数,在编程时可以int a=100也可以int a=0xabba
。区别就是一个用十进制一个用十六进制,还有8进制,2进制Python允许在数字中间以_分隔,因此,写成10_000_000_000和10000000000是完全一样的。十六进制数也可以写成0xa1b2_c3d4。
这个特性可以方便我们知道0是否写少
浮点数:
就是数学上的小数,也可记为具有飘浮着的小数点的数.
对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。毕竟小数可以通过计数法有无数种表示方式
字符串:
字符串是以单引号’或双引号"括起来的任意文本.如果’本身也是一个字符,那就可以用""括起来.
如果字符串内部既包含’又包含"怎么办?可以用转义字符\来标识'I\'m \"OK\"!'
放心里面的\并不会保存进去字符串变量中.该字符串表示的是I'm "OK"!
==\n表示换行,\t表示制表符,字符\本身也要转义,所以\表示的字符就是==
转义字符可以理解多了\原意就发生了改变.
如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r’‘表示’'内部的字符串默认不转义.(其实就是简化了如果你要在字符串中表示\\,在编程中可以少打一些转义字符)
在交互式命令行内输入,注意在输入多行内容时,提示符由>>>变为…,提示你可以接着上一行输入,注意…是提示符,不是代码的一部分
布尔值bool
一个布尔值只有True、False两种值(要大写啊)
布尔值可以用and、or和not运算。其实就是与或非逻辑运算
布尔值经常用在条件判断中
空值None
同java的null
变量
变量名必须是大小写英文、数字和_的组合,且不能用数字开头
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量
例子:a=1 a=True
像python语言这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下(// 表示注释):
int a = 123; // a是整数类型变量 a = "ABC"; // 错误:不能把字符串赋给整型变量
和静态语言相比,动态语言更灵活,就是这个原因。
a='ABC’其实a保存的是’ABC’字符串的地址
常量
常量就是不能变的变量.在Python中,通常用全部大写的变量名表示常量
PI=3.14
但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI的值,也没人能拦住你。
在Python中,有两种除法,一种除法是/:
/除法计算结果是浮点数
还有一种除法是//,称为地板除,两个整数的除法仍然是整数
//除法只取结果的整数部分
余数部分可以通过%获得
字符串
最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言
对于单个字符的编码,Python提供了**ord()**函数获取字符的整数表示,**chr()**函数把编码转换为对应的字符
ord(‘A’)
65
ord(‘中’)
20013
chr(66)
‘B’
chr(25991)
‘文’
如果知道字符的整数编码,还可以用十六进制这么写str:
‘\u4e2d\u6587’
‘中文’
\u表示Unicode编码
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示:
x = b'ABC'
要注意区分’ABC’和b’ABC’,前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
以Unicode表示的str通过**encode()**方法可以编码为指定的bytes
‘ABC’.encode(‘ascii’)
b’ABC’
‘中文’.encode(‘utf-8’)
b’\xe4\xb8\xad\xe6\x96\x87’
‘中文’.encode(‘ascii’)
Traceback (most recent call last):
File “”, line 1, in
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
在bytes中,无法显示为ASCII字符的字节,用\x##显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用**decode()**方法:
b’ABC’.decode(‘ascii’)
‘ABC’
b’\xe4\xb8\xad\xe6\x96\x87’.decode(‘utf-8’)
‘中文’
如果bytes中包含无法解码的字节,decode()方法会报错:
b’\xe4\xb8\xad\xff’.decode(‘utf-8’)
Traceback (most recent call last):
…
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 3: invalid start byte
如果bytes中只有一小部分无效的字节,可以传入errors='ignore’忽略错误的字节:
b’\xe4\xb8\xad\xff’.decode(‘utf-8’, errors=‘ignore’)
‘中’
要计算str包含多少个字符,可以用**len()**函数
len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数
在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码
格式化
最后一个常见的问题是如何输出格式化的字符串
我们经常会输出类似亲爱的xxx你好!你xx月的话费是xx,余额是xx
之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式。
在Python中,采用的格式化方式和C语言是一致的,用%实现
‘Hello, %s’ % ‘world’
‘Hello, world’
‘Hi, %s, you have $%d.’ % (‘Michael’, 1000000)
'Hi, Michael, you have $1000000.
%运算符就是用来格式化字符串的
在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。
常见的占位符有:
占位符 替换内容
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数
其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数:
print(‘%2d-%02d’ % (3, 1))
print(‘%.2f’ % 3.1415926)
我们以这两行代码来说明下具体使用情况
1.首先第一行%2后面只有2代表是默认以空格来补充所需要填满的位数.
2.第一行的2就是这个占位符代表的内容最后占几位
3.然后是可以填0来补充需要填满的位子,例子就是第一行的第二种
4.第二行用到了.2表示的是小数点后两位
如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串
有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%
format()
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多
‘Hello, {0}, 成绩提升了 {1:.1f}%’.format(‘小明’, 17.125)
‘Hello, 小明, 成绩提升了 17.1%’
f-string
最后一种格式化字符串的方法是使用以f开头的字符串,称之为f-string,它和普通字符串不同之处在于,字符串如果包含{xxx},就会以对应的变量替换:
r = 2.5
s = 3.14 * r ** 2
print(f’The area of a circle with radius {r} is {s:.2f}')
The area of a circle with radius 2.5 is 19.62
上述代码中,{r}被变量r的值替换,{s:.2f}被变量s的值替换,并且:后面的.2f指定了格式化参数(即保留两位小数),因此,{s:.2f}的替换结果是19.62。
两个**代表平方
使用list和tuple
list
list是一种有序的集合,可以随时添加和删除其中的元素。
例子:
classmates = [‘Michael’, ‘Bob’, ‘Tracy’]
classmates
[‘Michael’, ‘Bob’, ‘Tracy’]
用len()函数可以获得list元素的个数
用索引来访问list中每一个位置的元素,记得索引是从0开始的(不要越界访问)
最后一个元素的索引是len(classmates) - 1
如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素可以理解为负号代表了"倒数"的意思,所以就是倒数第一个的意思,同时-2,-3什么也不言而喻了,同时不可越界访问!!!
list是一个可变的有序表,所以,可以往list中追加元素到末尾
classmates.append('Adam')
也可以把元素插入到指定的位置,比如索引号为1的位置
classmates.insert(1, ‘Jack’)
classmates
[‘Michael’, ‘Jack’, ‘Bob’, ‘Tracy’, ‘Adam’]
要删除list末尾的元素,用pop()方法(跟java队列方法同名)\
classmates.pop()
‘Adam’
classmates
[‘Michael’, ‘Jack’, ‘Bob’, ‘Tracy’]
要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
classmates.pop(1)
‘Jack’
classmates
[‘Michael’, ‘Bob’, ‘Tracy’]
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
classmates[1] = ‘Sarah’
classmates
[‘Michael’, ‘Sarah’, ‘Tracy’]
list里面的元素的数据类型也可以不同,比如:
L = [‘Apple’, 123, True]
list元素也可以是另一个list(类比二维数组)
一个空的list,它的长度为0
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
classmates = (‘Michael’, ‘Bob’, ‘Tracy’)
它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的:classmates[0],classmates[-1],但不能赋值成另外的元素。
tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple
tuple的陷阱
要定义一个只有1个元素的tuple,如果你这么定义:
t = (1)
t
1
定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义;
Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
“可变的”tuple:
t = (‘a’, ‘b’, [‘A’, ‘B’])
t[2][0] = ‘X’
t[2][1] = ‘Y’
t
(‘a’, ‘b’, [‘X’, ‘Y’])
其实list里面那些已经是list的元素,而t里面的list又没有指向其他list,所以还是不变的
可以理解为你们小区是那个tuple,而里面的元素是小区的楼,楼是不变,而楼里面的人是楼的元素,人怎么变,小区依然是小区.
条件判断
age = 20
if age >= 18:
print('your age is', age)
print('adult')
相比java少了条件那里的(),和代码块的{},多了4个空格的缩进,还有冒号(差点忘了)
java:else if
变成:elif
下面这个特点类似c
if判断条件还可以简写,比如写:
if x:
print('True')
只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。
input:
input()返回的数据类型是str
Python提供了int()函数,还有其他基础类型的函数,来负责将str转换为对应的数据类型