说在前面的话,本系列为复学笔记,相当于作者的巩固笔记,虽然介绍的是python的基础但是更适合有一定程序设计基础,或是之前有python基础,一段时间后有些遗忘,可以用来复习,本系列对程序设计基础涉及比较少,不适合完全入门的选手。


文章目录

  • Python基础
  • 基础数据类型及变量
  • 集合数据类型Set
  • 序列数据类型
  • 元组Tuple
  • 字典Dict
  • 字符串数据类型String
  • 字符串及编码


Python基础

基础数据类型及变量

基础数据类型整数int、浮点数float、布尔型bool、复数complex等不再赘述。

下面列出一些可能存有困惑的地方:

1、Python的变量:Python变量本身类型不固定,称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。由于Python的变量数据类型不固定,所以等号=赋值语句可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。

2、Python的数据类型没有存储长度的大小限制,如整数型,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648-2147483647,Python的浮点数也没有大小限制,但是超出一定范围就直接表示为inf(无限大)。

3、None:Python 中的None 是一个特殊常量,不是0,也不是False,不是空字符串,None表示更多的是一种不存在,是真正的空,当函数无输出时常返回None。None 可作为一个对象,该对象的类型为:NoneType,它只是一个空值的对象,也就是一个空的对象,只是没有赋值而已。None 表示的含义,更多的是一种不存在,是真正的空,而不是空列表[]的空,也不是空的字符串,比如一个函数没有返回值def f(): pass,因此not None可以表示True

>>> type(None)
<class 'NoneType'>
>>> id(None)
140719064431840
>>> def f():
	pass

>>> f()
>>> a=f()
>>> a is None
True
>>> not None
True

4、关于常量:在Python中,通常用全部大写的变量名表示常量:

PI = 3.14159265359

但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,该值可以作为变量改变。

集合数据类型Set

Set为集合,无序不包含重复元素可以用来过滤重复数据元素作为dict的key输入。

Set的创建需要使用set()函数,而不能使用{ }创建。

>>> s=set([1,2,3])
>>> s
{1, 2, 3}
>>> a={}
>>> type(a)
<class 'dict'>
>>> type(s)
<class 'set'>

序列数据类型

Python有三种序列数据类型:列表、元组、字典

其区别可以参照下表格:

数据类型

是否有序

数据元素是否可变

列表List

有序

可变

元组Tuple

有序

不可变

字典Dict

无序

可变

索引:对于有序序列,可以使用索引来访问每一个位置的元素。

索引从0开始,倒序的索引从-1开始,对于索引的使用参考下表:

L=list(range(1,101))

1

2

3


98

99

100

正序

0

1

2


97

98

99

倒序

-100

-99

-98


-3

-2

-1

当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1

元组Tuple

元组指向不变性tuple一旦初始化就不能修改,当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。

但是当元组中含有可变的序列类型,如tuple、dict时,可以改变序列中的元素来达到改变元组中元素的效果,但是本质上元组中的元素没有改变,即指向的元素不变。

因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

>>> a=[3,4]
>>> t=(1,2,a)
>>> a.append(5)
>>> t
(1, 2, [3, 4, 5])

单元素元组:只有1个元素的tuple定义时必须加一个逗号,,来消除歧义。Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

>>> a=(1)
>>> a
1
>>> b=(1,)
>>> b
(1,)

在python中,多个元素赋值,默认以元组的形式进行赋值,同样交换元素值也可以使用元组进行交换,省去了临时变量交换变量值。

>>> a,b=0,1       #相当于(a,b)=(0,1)   a=0   b=1
>>> a,b=b,a+b     #相当于(a,b)=(b,a+b)
			     #	   t=(b,a+b)
			     #	   a=t[0]
			     #	   b=t[1]
字典Dict

字典dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,可以直接用键查找对应值,具有极快的查找速度,但需要占用大量的内存,内存浪费多。

1、dict的key必须是不可变元素且不能重复,这被称为“可哈希性”,可以用hash()函数检测一个对象是否可哈希。

>>> hash('abc')            #字符串类型为不可变类型
2688246369669087898
>>> hash((1,2,(1,1)))      #元组类型也为不可变类型
-43645920702070155
>>> hash((1,[1,2]))       #该数据类型中含有可变类型列表
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    hash((1,[1,2]))
TypeError: unhashable type: 'list'

2、一个key只能对应一个value,多次对一个key放入value,后面的值会把前面的值覆盖掉。

3、key不存在,dict就会报错,要避免key不存在的错误,有两种办法,一是通过in判断key是否存在,二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value,返回None的时候Python的交互环境不显示结果。

>>> score={'Jack':99,'Marry':78,'Bob':88,'Amy':77}
>>> score['Jack']
99
>>> score['Black']
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    score['Black']
KeyError: 'Black'
>>> 'Black' in score
False
>>> score.get('Black')
>>> score.get('Black',-1)
-1

4、使用序列创建字典,这里使用zip()函数。

zip()函数:可以将多个列表、元组或其它序列成对组合成一个元组列表,(这里很形象,就像拉链一样,把多个序列拉成每一个元素一一对应的拉链,最后形成一个有序的元组列表):

>>> L1=['one','two','three']
>>> L2=[1,2,3]
>>> zipped=zip(L1,L2)
>>> zipped
<zip object at 0x000001F488F42608>
>>> list(zipped)
[('one', 1), ('two', 2), ('three', 3)]

注意zip()返回的是一个可迭代的zip对象。

zip可以处理任意多的序列,元素的个数取决于最短的序列:

>>> L3=['a','b','c','d']
>>> list(zip(L1,L2,L3))
[('one', 1, 'a'), ('two', 2, 'b'), ('three', 3, 'c')]

zip也可以把给定的配对拆分,给出一个“被压缩的”序列,zip可以被用来解压序列。也可以当作把行的列表转换为列的列表。

>>> L=list(zip(L1,L2))
>>> L
[('one', 1), ('two', 2), ('three', 3)]
>>> string,num=zip(*L)
>>> string
('one', 'two', 'three')
>>> num
(1, 2, 3)

通过zip()将多个序列创建为字典:

mapping = {}
for key, value in zip(key_list, value_list):
    mapping[key] = value

因为字典本质上也是二元元组的集合,也可以通过使用dict()函数,配合zip()使用:

>>> mapping = dict(zip(L1,L2))
>>> mapping
{'one': 1, 'two': 2, 'three': 3}

字符串数据类型String

字符串数据类型String本身是一种数据元素不可变的List。

对不可变对象的理解:str是不变对象,而list是可变对象。对于不可变对象str,对str a进行操作

>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'

虽然字符串有个replace()方法,也确实变出了'Abc',但变量a最后仍是'abc',要始终牢记的是,a是变量,而'abc'才是字符串对象!有些时候,我们经常说,对象a的内容是'abc',但其实是指,a本身是一个变量,它指向的对象的内容才是'abc'

复旦大学Python大作业_开发语言

当我们调用a.replace('a', 'A')时,实际上调用方法replace是作用在字符串对象'abc'上的,而这个方法虽然名字叫replace,但却没有改变字符串'abc'的内容。相反,replace方法创建了一个新字符串'Abc'并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串'abc',但变量b却指向新字符串'Abc'了:

复旦大学Python大作业_python_02


所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

转义字符:字符\经常用于转义,而字符\需要用\\表示,如果字符串中需要多次使用\将会非常麻烦,Python允许用r''表示''内部的字符串默认不转义,这将经常运用在文件路经的表示中。

with open(r"C:\Users\pythonProject\a.txt",'r',encoding="utf-8") as f:
    c = f.read() 
    print(c)

多行内容的表示:如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容。

>>> s=('''line1
line2
line3''')
>>> print(s)
line1
line2
line3
字符串及编码

编码是字符串中比较特殊的问题,我们都知道计算机只能处理0 1代码,如果想要处理文本,就必须先把文本转换为代码才能处理,这个过程即编码。

下面介绍几种常用的编码格式:

ASCII编码:最早的字符集编码,只有127个字符,包括大小写英文字母、数字和一些符号,无法表示中文。

GB2312编码:中文字符集编码,与ASCII编码不冲突。

Unicode编码:即统一码,也叫万国码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等,Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。现代操作系统和大多数编程语言都直接支持Unicode。Unicode编码通常为两个字节,英文部分只需要在ASCII编码前面补一个字节的零即可,中文即其他字符需要两个或以上的字节。

UTF-8编码:可变长编码,由于Unicode表示英文字符也需要两个字节,原本使用ASCII编码只需要一个字节就可以表示,如果文本中包含大量的英文字符,UTF-8中常用的英文字母被编码为1个字节,汉字通常为3个字节,只有很生僻的字符才会被编码为4-6个字节,使用UTF-8可以比Unicode编码节省很多空间,同时与ASCII码不冲突,可以将ASCII码看做UTF-8的一部分。

使用表格对比ASCII、Unicode、UTF-8三种编码的区别:

字符

ASCII

Unicode

UTF-8

A

01000001

00000000 01000001

01000001



01001110 00101101

11100100 10111000 10101101