输入输出
输出
最简单的输出
1 | print('hello,world') |
也可以接受多个字符串
1 | print('hello','world') |
多行输出
1 | print('''line1 |
可以直接计算结果
1 | print(10+20) |
格式化输出
1 | 在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下: |
输入
**input()**接受的数据默认以字符串形式储存,若需要使用,需提前进行数据转换
python基础
数据类型
整数
在python中的表示方法和数学上的写法一样
也可以使用十六进制表示,例如:0xff00,0xa5b4c3d2,等等。
对于很大的数,例如10000000000,很难数清楚0的个数。Python允许在数字中间以_分隔,因此,写成10_000_000_000和10000000000是完全一样的。
浮点数
浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。
1 | print(0.1+0.2) |
字符串
字符串是以单引号'或双引号"括起来的任意文本,比如'abc'
如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识
1 | 例如 |
还能用r''表示''内部的字符串默认不转义
1 | a=r'\\\t\\' |
布尔值
一个布尔值只有True、False两种值
数字布尔规则
1 | 整数:0为False,其他均为True |
字符串布尔规则
字符串的真假判断只基于是否为空,而不考虑内容。
1 | "" False 空字符串 |
布尔值可以用and、or和not运算
空值
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
主要用途
1.表示函数没有返回值
1 | def greet(name): |
2.作为函数参数的默认值
1 | def connect_to_database(host, port=None): |
……
变量
命名规则:
1.只能包含字母(a-z, A-Z)、数字(0-9)、下划线(_)
2.只能以字母或下划线开头
3.区分大小写
4.避免关键字
赋值
1 | 进行a = 'ABC'赋值时,Python解释器干了两件事情: |
字符串以及编码
最早的ASCII码利用一字节表示大小写英文字母,数字和一些符号,但是后来发现一个字节不够用,而且不能和ASCII码冲突,于是各个国家都制定了字节的编码标准,但是这又会导致冲突,在多语言文本中出现乱码,为了解决冲突问题,产生了Unicode字符集,用2个字节表示一个字符(除了非常偏僻的使用4个字节),
但是如果是纯英文的话又会导致使用Unicode编码比ASCII编码需要多一倍的存储空间,于是又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
字符编码工作方式:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器
字符串与字节类型的转换
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
Python对bytes类型的数据用带b前缀的单引号或双引号表示:
1 | x = b'ABC' |
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
1 | >>> 'ABC'.encode('ascii') |
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
1 | >>> b'ABC'.decode('ascii') |
len()
计算字符长度
1 | >>> len('ABC') |
如果是bytes,就计算字节数
1 | >>> len(b'ABC') |
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
1 | #!/usr/bin/env python3 |
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
列表(list)和元组(tuple)
list
list是一种有序的集合,可以随时添加和删除其中的元素。
获取元素个数
1 | >>> len(classmates) |
访问元素(索引从0开始)
1 | >>> classmates = ['Michael', 'Bob', 'Tracy'] |
追加元素
1 | >>> classmates.append('Adam') |
插入元素
1 | >>> classmates.insert(1, 'Jack') |
删除元素
1 | >>> classmates.pop()(默认末尾) |
替换元素
1 | >>> classmates[1] = 'Sarah' |
一个列表可以储存不同数据类型
1 | >>> L = ['Apple', 123, True] |
list中也能嵌套list
1 | >>> s = ['python', 'java', ['asp', 'php'], 'scheme'] |
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
1 | >>> classmates = ('Michael', 'Bob', 'Tracy') |
不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
元组的创建
1 | >>> t = ()或t = tuple() |
”可变“的元组
1 | >>> t = ('a', 'b', ['A', 'B']) |
模式匹配
当使用if…elif进行条件判断的时候,如果条件很多,就会显得代码很复杂,可读性较差,此时可以使用match语句:
1 | score = 'B' |
复杂匹配
如果有多个匹配值则使用‘|’来分隔不同的值
1 | case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18: |
列表匹配
例
1 | args = ['gcc', 'hello.c', 'world.c'] |
其中 case ['gcc', file1, *files]:``file1匹配的是gcc后的第一个元素。*files则是剩余所有没被匹配的元素,返回的结果是列表
', '.join(files)则是将files列表中的元素以’,‘隔开。
dict(字典)和set(集合)
字典dict全称dictionary,在其他语言中也称为map使用,使用键值对储存,有极快的查找速度。因为其底层使用了哈希表,实现了类似随机存取的效果,在哈希表不冲突的时候时间复杂度为o(1),因此可以快速查询。代价是内存占用多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
1 | d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} |
因为哈希值是对key进行哈希计算得到的,所以如果有相同的key值会发生冲突,python采用覆盖的形式处理,也就是相同的最后一个key中的值是最终的值
1 | d = {'Michael': 95, 'Bob': 75, 'Tracy': 85,'Michael': 34} |
同样的,key的值应该为不可变对象,在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
报错
若key不存在则会报错
要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
1 | >>> 'Thomas' in d |
二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
1 | >>> d.get('Thomas') |
字典的删除
删除一个key,用pop(key)方法,对应的value也会从dict中删除:
1 | d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} |
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
创建集合
1 | >>> s = {1, 2, 3} |
添加元素
add()函数
1 | >>> s.add(4) |
删除元素
1 | >>> s.remove(4) |
数学计算
可以进行交集,并集等运算
1 | >>> s1 = {1, 2, 3} |
对不可变对象使用replace()
1 | >>> a = 'abc' |
这里是因为使用replace()时是创造了一个新的字符串‘Abc’并返回,而原字符串‘abc’是不变的,又a指向字符串‘abc’这一事实不变,所以a还是’abc’,当我们把replace()创造出的‘Abc’赋值给b,便能输出‘Abc’
1 | >>> a = 'abc' |
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
函数
函数调用
调用一个函数需要知道函数名和对应参数,否则会报错
函数的定义
定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
函数体内部执行的语句一旦执行到return便会停止
如果没有return语句执行完返回None结果,return None可以简写为return
空函数
1 | def nop(): |
这种函数什么都不会做,但是可以用来占位让代码先跑起来。
参数检查
我们自己写的函数python会检查参数个数,但不会检查参数类型,因此我们在定义函数的时候要自己加入错误信息。数据类型检查可以用内置函数isinstance()实现:
例如
1 | def my_abs(x): |