参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
一、输入和输出
通过“print()"函数可以向屏幕输出指定文字:
print("Hello World!")
这里通过双引号加入要输出的字符串,也可以通过单引号。该函数也接受多个字符串,之间用逗号”,"分隔,要注意的是这里解释器遇到分隔符逗号时会自动输出一个空格:
print("Hello","World","!")
通过input()函数可以让用户输入字符串:
name=input()
当上行代码运行后,系统就等待用户的输入了,输入完成后按回车键结束输入。输入的内容被存储到name这个变量中了。
一次完整、友好的输入输出程序如下:
print("Please enter your name:") name = input() print("Hello,",name)
上述的提示信息也可以直接用input()实现,input()的参数会先被系统打印出来,然后再等待用户输入:
name = input("Please enter your name: ") print("Hello,",name)
二、Python基础
*Python程序是大小写敏感的;
*以“#"开头的语句是注释;
*作为良好的编程习惯,缩进建议使用4个空格符;
(一)数据类型
Python中的数据类型包括:整数、浮点数、字符串、布尔值、空值。
*字符串:通过单引号或双引号括起来的任意文本即是字符串,如"abc"、"k"、”123“等。某些情况下需要通过转义字符\来标识,对于字符串I‘m "OK"!,在Python中需要如下表示:‘I\‘m \"OK\"‘。
转义字符中\n表示换行,\t表示制表符,\\表示字符‘\‘本身。有一种情况Python可以通过r‘‘(字母r+两个单引号)表示其内部的字符串默认不进行转义:
print(‘\\\t\\‘) #输出\ \ print(r‘\\\t\\‘) #输出\\\t\\
*空值在Python中用None表示,并不能理解为0。
*变量:对于变量的数据类型不固定的程序语言称为动态语言,与之对应的是静态语言。Python即是一种动态语言,所以在实际使用中,并不需要声明这个过程就可以直接使用,在赋值后也可以再次赋予不同类型的值:
k=10 k="you" k=True
对于下列代码的理解:
a="ABC" #1、内存中创建一个“ABC”的字符串 #2、内存中创建一个名为a的变量,并把他指向上述“ABC" b=a #把a的指向赋值给b,即指向上述”ABC" a="XYZ" #1、内存中创建一个“XYZ”的字符串 #2、把a指向上述“XYZ" print(b) #输出"ABC",因为b的指向仍然为”ABC“
(二)字符编码
因为计算机是美国人发明的,所以最早只有127个字符(26个大小写字母加一些符号)被编码到计算机里,这个对应的编码表被称为ASCII编码,比如A对应的ASCII码是65(2进制为0100 0001),“z”对应编码为122(2进制为0111 1010);ASCII码长度为一字节,无法处理中文等其他符号,Unicode把所有语言都统一到一套编码中,通常用两个字节表示一个字符(除非特别生僻的会用到4个字节),字母A对应的Unicode编码为00000000 01000001;比ASCII码多出一倍的存储空间,因此又出现了可变长的UTF-8编码。UTF-8编码把Unicode字符根据不同的大小编码成1-6个字节,英文字母为1字节,中文汉字字符通常为3字节,很生僻的字符4-6字节,这样如果要处理的字符包含大量英文字母,那使用UTF-8编码就可以方便存储和传输。
目前计算机系统通用的字符编码工作方式:在计算机内存中统一使用Unicode编码,当需要保存到硬盘或者需要传输时就使用UTF-8。比如用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存中,编辑完成后再转换成UTF-8进行保存到文件里。
在最新的Python3中,字符串是以Unicode进行编码的,对于单个字符的编码,Python提供了ord()函数获取其整数编码值,chr()函数则反向把编码值转换成字符。
由于Python中字符串类型是str,在内存中用Unicode表示,一个字符对应若干字节,如果要在网络上传输或者保存到硬盘里,就需要把str变为以字节为单位的bytes:
x=b‘ABC‘
需要区分‘ABC‘和b‘ABC‘,前者是字符串,后者虽然内容和前者一样,但是bytes的每个字符只占用一个字节,字符串可以通过encode()函数编码为指定的bytes:
>>>‘ABC‘.encode(‘ascii‘) b‘ABC‘ >>>‘中文‘.encode(‘utf-8‘) b‘\xe4\xb8\xad\xe6\x96\x87‘ >>>‘中文‘.encode(‘ascii‘) TraceBack(most recent call last): ....
反过来,如果在硬盘或网络上读取了字节流,即数据为bytes,需要把bytes变为str,要用到decode()方法:
>>>b‘\xe4\xb8\xad\xe6\x96\x87‘.decode(‘utf-8‘) ‘中文‘ >>>b‘ABC‘.decode(‘ascii‘) ‘ABC‘
要计算str中包含多少个字符,可以使用len()函数,如果换成bytes,len()函数就计算字节数:
>>> len(‘ABC‘) 3 >>> len(‘中文‘) 2 >>> len(b‘ABC‘) 3 >>> len(b‘\xe4\xb8\xad\xe6\x96\x87‘) 6 >>> len(‘中文‘.encode(‘utf-8‘)) 6
在操作字符串时,经常遇到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编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
三、list、tuple、dict和set
(一)list
list是一种有序的集合,可以添加和删除元素。
classmates=[‘Michael‘,‘Bob‘,‘Tracy‘] #输出列表长度3 len(classmates) #各个元素的访问 classmates[0] classmates[1] classmates[2] classmates[-1] classmates[-2] classmates[-3] #在列表尾部添加元素 classmates.append[‘Adam‘] #指定位置插入元素 #插入后列表为:‘Michael‘ ‘Bob‘ ‘Jenny‘ ‘Tracy‘ ‘Adam‘ classmates.insert(2,‘Jenny‘) #删除列表尾部元素并返回 classmates.pop() #删除指定位置的元素并返回 #删除后列表为:‘Michael‘ ‘Jenny‘ ‘Tracy‘ ‘Adam‘ classmates.pop(1) #列表内的元素的数据类型可以不相同 Lista=[‘123‘,88,‘abc‘,True,[1,2,‘12‘]] #返回‘12‘ Lista[4][2]
(二)tuple
tuple是另外一种有序的列表,但其一旦初始化就不能进行修改,也没有insert、append这些方法,所以代码更安全。
#定义一个tuple t=(1,2) #定义一个空元素的tuple t1=() #定义一个元素的tuple,元素后必须加一个逗号 t2=(1,)
对于如下代码:
t=(‘a‘,‘b‘,[‘A‘,‘B‘]) t[2][0]=‘X‘ t[2][1]=‘Y‘
可以发现t改变了,如何在这里理解tuple元组的不可变呢?元组t在定义时候有三个元素,为两个字符串和一个列表;要注意这里第三个元素的指向始终是这个列表,只是这个列表最开始是指向了存储‘A‘和‘B‘的内存,随后又指向了新创建的两个字符串‘X‘和‘Y‘的内存。元组中第三个元素的指向并没有变,变的是其指向的列表的指向。
(三)dict
Python内置的数据类型字典dict使用键:值的方式存储,具有极快的查询速度。
d={‘Michael‘:95,‘Bob‘:75,‘Tracy‘:85} #只需要知道键就可以直接查询到值 print(d[‘Tracy‘])
与列表不同,列表是有序的,查询列表需要从下标0开始逐个查找,直到查找到为止。字典是先直接计算出键对应的位置,然后直接取出其值,所以对于这种key:value的存储方式,在添加元素的时候,必须根据key算出value的存储位置,这种算法称为哈希算法。要保证哈希算法的正确性,作为key的对象就不能变,因此key 必须是不可变类型,即整数、字符串、浮点数、元组。也因此字典中一个键只能对应一个value。
d={‘Michael‘:95,‘Bob‘:75,‘Tracy‘:85} #直接添加新元素 d[‘Jenny‘]=90 #多次添加同一键的值,后面会覆盖前面的值 d[‘Jenny‘]=96 #如果访问一个不存在的键会报错 print (d[‘Tom‘]) #可以用in先进行判断 str=input(‘please enter the name:‘) if str in d: print (d[str]) #通过get()方法返回其值,如果参数键不存在返回None #也可以在get(‘key‘,?)中第二个参数自定义如键不存在则返回的值 print (d.get(‘Tom‘,‘查询的键不存在‘)) #pop(key)方法可以删除一个键及其值 x=pop(‘Bob‘)
(四)set
set类似于dict,是一组key的集合,所以set的元素必须也为不可变类型,但其不存储值,因为key不能重复,所以set中也不能有重复的元素。
#set的创建需要通过set()方法,并提供一个列表作为输入集 #创建后s={1,2,3},重复元素会被过滤掉 s=set([1,2,2,3,1]) #通过add()方法添加元素 s.add(4) s.add(2) #s={1,2,3,4} #通过remove()方法删除元素 s.remove(4) #s={1,2,3} #两个set可以做数学意义上的交集合集等操作 s0={[1,3,5]} sn1=s&s0 #sn1={1,3} sn2=s|s0 #sn2={1,2,3,5}
四、循环
Python中的循环有两种方式:
(一)for/in循环
依次把需要循环的每个元素迭代出来:
names=[‘Michael‘,‘Bob‘,‘Tracy‘] for name in names: print (name)
如果要计算1到10之间的整数和:
t=(1,2,3,4,5,6,7,8,9,10) sum=0 for x in t: sum+=x print (sum)
那么如果要计算更大区间的整数之和,比如1到100的,就可以用到range()函数,先生成一个整数序列,再通过list()函数将其转换成list。如range(5)生成的序列从0到小于5的整数:0,1,2,3,4。
list(range(5)) #生成[0,1,2,3,4]
sum=0 for x in range(101): sum+=x print(sum)
(二)while循环
只要条件满足,就不断循环,直到条件不满足时退出。
#计算100以内奇数之和 sum=0 i=0 while (2*i+1<=100): sum+=2*i+1 i++ print(sum)
(三)break
break语句一般用于循环中的提前退出:
n=1 while n<100: if n>10: break print(n) n=n+1 print(‘end‘)
(四)continue
用于循环过程中跳出当前次的循环,直接进入下一次循环:
#continue计算100以内奇数之和 sum=0 i=0 while i<=100: if i%2==0: i++ continue
i++ sum+=i print(sum)