Day13:Python基础

Python基础

Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。

输入输出

 # 输出字符串
 print('Hello,World!')
 # 用“,”隔开,可以连成一串输出。
 print('hard','world!')
 # 可以打印整数或者计算结果。
 print(100+200)  //输出:300
 # 输入
 name=input()   //可以加参数,输出到屏幕上

print()控制输出样式

 # r '' 表示内部的字符串默认不转义
 print(r'')
 # '''   ''' 表示多行内容
 print('''   line1
 line2
 line3''')
 #

注释

  # 这是一段python注释    

数据类型和变量

python是动态语言:定义变量的时候不用指定类型。

空值

用None表示。不是NULL。

整数的除法

  • /除法计算结果是浮点数,即使两个整数恰好整除,结果也是浮点数

  • //,地板除。结果是整数

字符串和编码

ASCII,Unicode,UTF-8

字符ASCIIUnicodeUTF-8
A 01000001 00000000 01000001 01000001

ASCII存英文和数字等,通常存1个字节。Unicode存一切,通常占2个字节,但是当编码里只有英文时,就浪费了一个字节的空间,就出现了可变长的编码集UTF-8。UTF-8的英文占一个字节,中文通常是3个字节。可见,如果文件中大部分是英文,UTF-8可以节省不少空间。

在Python3中,字符串是以Unicode编码的。

python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符。


由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

Python对bytes类型的数据用带b前缀的单引号或双引号表示:

 x = b'ABC'
 X='ABC'
 #虽然两者显示内容一样,但后者是str类型,后者是bytes,每一个字符占一个字节。

以Unicode表示的str通过encode()方法可以编码为指定的bytes

 'ABC'.encode('ascii') # 输出: b'ABC'
 '中文'.encode('utf-8') # 输出:b'\xe4\xb8\xad\xe6\x96\x87'

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

 b'ABC'.decode('ascii') #输出: 'ABC'

如果包含无法解码的字节,decode()会报错,可以传入errors='ignore'忽略错误的字节。

 b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')

要计算str包含多少个字符,可以用len()函数。

 >>> len('中文')
 2

如果是bytes,len()函数就计算字节

>>> len('中文'.encode('utf-8'))  # 一般1个中文字符经过UTF-8编码后通常会占用3个字节。
6

在操作字符串时,我们经常遇到strbytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对strbytes进行转换。


由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

格式化

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

'Hello, %s' % 'world'
'Hi, %s, you have $%d.' % ('Michael', 1000000)

%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略

C语言中用’,‘隔开,Python用’%‘隔开。

使用list和tuple

列表:list

Python内置的一种数据类型,列表。

list是一种有序的集合,可以随时添加和删除其中的元素。

classmates=['Michael','Bob','Tracy']
len(classmates) >>> 3

用索引可以访问list中每一个位置的元素,从0开始。

classmates[0] >>> 'Michael'

如果要取最后一个元素,可以用-1做为索引

list是一个可变的有序表,所以,可以往list中追加元素到末尾:

classmates.append('Adams')

也可以把元素插入到指定的位置,比如索引号为1的位置:

classmates.insert(1,'Jack')

删除list末尾的元素,用pop()方法

可以加参数删除指定位置的元素(索引从0开始)

 classmates.pop()
 classmates.pop(1)

list里面的元素类型可以不同,甚至可以是list。例如:

 newlist=['python','c',['java','javascript']]

tuple 元组

一旦初始化就不能修改。

 classmates=('A','B','C')

不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

注意:如果定义只有一个元素的tuple,需要加上',',不然会被认为是一个元素。

 # 错误定义
 t=(1)
 # 正确定义
 t=(1,)

看一个”可变的“tuple

 t=('jw',['solo','code'],'027')  >>>('jw',['solo','code'],'027') 
 t[1][0]='music'            >>>('jw',['music','code'],'027')

表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

条件判断

语法和其他语言基本一致。

不一样的是,Python靠缩进分块。

 age=20
 if age>=18:
     print('your age is',age)
     print('adult')
 else:
     print('teenager')

注意不要少写冒号。

if语句的完整形式就是:

 if <条件判断1>:
    <执行1>
 elif <条件判断2>:
    <执行2>
 elif <条件判断3>:
    <执行3>
 else:
    <执行4>

再议 input

 age=input('age:')
 if age>=18:
     print('adult')
 else:
     print('teenager')

报错:

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
 TypeError: unorderable types: str() > int()

input()返回的数据类型是str,str不能直接和整数比较,所以我们应该先把str转换成整数。

可以用int()将str转化成int型。

 age1=input('age:')
 age2=int(age1)
 if age2>=18:
     print('adult')
 else:
     print('teenager')

如果我们输入的是’abc‘ 这时会报错,

当int()函数发现字符串不是一个合法的数字时就会报错。

循环

Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来。

  • for ... in ... :

看例子:

 names = ['Michael', 'Bob', 'Tracy']
 for name in names:
     print(name)

所以for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。

如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:

 list(range(5))
  • While循环

 sum = 0
 n = 99
 while n > 0:
    sum = sum + n
    n = n - 2
 print(sum)

break

 n = 1
 while n <= 100:
     if n > 10: # 当n = 11时,条件满足,执行break语句
         break # break语句会结束当前循环
     print(n)
     n = n + 1
 print('END')

continue

在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。

 n = 0
 while n < 10:
    n = n + 1
    if n % 2 == 0: # 如果n是偶数,执行continue语句
        continue # continue语句会直接继续下一轮循环,后续的print()语句不会执行
    print(n)

使用dict和set

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

 names = ['Michael', 'Bob', 'Tracy']
 scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

 d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
 d['Michael']   >>> 输出:95

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

 d['Adam']=67

如果key不存在,dict就会报错。

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

 'Thomas' in d

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

 d.get('Thomas')
 d.get('Thomas',-1)

注意:返回None的时候Python的交互环境不显示结果。

  • 和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;

  2. 需要占用大量的内存,内存浪费多。

  • 而list相反:

  1. 查找和插入的时间随着元素的增加而增加;

  2. 占用空间小,浪费内存很少。

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象

posted @ 2021-10-19 23:13  027code  阅读(106)  评论(0)    收藏  举报