2. python语法入门

注释

对代码的解释和说明, 可以提供代码的可读性。

注释分为单行注释和多行注释
单行注释是以 # 开始
多行注释,可以使用三个双引号或者三个单引号""" """ ''' '''

# 定义字符串变量name
'''
我是多行注释
我是多行注释
我是多行注释
'''
age=19
"""
我是多行注释
我是多行注释
我是多行注释
"""

sex='男'

注意: ctr + / -> 单⾏行注释快捷键

变量的定义

变量: 通俗理解就是存储程序数据的容器。

变量定义的格式:变量名 = 数据 (变量名尽量有含义,方便理解 )

score=100 #定义一个变量名字叫score,存储的数据是100
print(score)

name='张三'
print(name)

pi=3.14
print(pi)

is_ok =True
print(is_ok)

#提示:在python里面不需要指定数据的类型,会根据数据自动推导出数据类型

#通过type查看变量类型
score_type=type(score)
print(score_type)

name_type=type(name)
print(name_type)

pi_type=type(pi)
print(pi_type)

print(type(is_ok))

总结: 常用的数据类型 int,str, float, bool, list, tuple, dict,set

变量的命名规则

变量名:是由字母,数字,下划线组成的,注意只有这三种,但不能以数字开头

错误的使用:

3name='李四'
print(3name)
name!age=18

变量命名方式: 驼峰命名法 和 下划线命名法
驼峰命名法: 小驼峰和大驼峰 小驼峰: 第一个单词首字母要小写,其它单词首字母都大写 大驼峰: 每个单词首字母都大写
下划线命名: 单词都使用小写字母,单词之间使用下划线进行分割, 比如: my_name

my_name='李四' #下划线命名
myName='李四' #小驼峰
MyName='李四' #大驼峰

关键字

关键字: 在python里面具有特殊功能的标识符(理解成变量名、函数名), 关键字不能作为变量名使用。

['False', 'None', 'True', 'and', 'as',
 'assert', 'break', 'class', 'continue', 'def', 
'del', 'elif', 'else', 'except', 'finally',
 'for', 'from', 'global', 'if', 'import',
 'in', 'is', 'lambda', 'nonlocal', 'not', 
'or', 'pass', 'raise', 'return', 'try',
'while', 'with', 'yield']

常用的数据类型转换

函数 说明
int(x [,base ]) 将x转换为一个整数
float(x ) 将x转换为一个浮点数
complex(real [,imag ]) 创建一个复数,real为实部,imag为虚部
str(x ) 将对象 x 转换为字符串串
repr(x ) 将对象 x 转换为表达式字符串串
eval(str ) 用来计算在字符串串中的有效Python表达式,并返回一个对象
tuple(s ) 将序列列 s 转换为一个元组
list(s ) 将序列列 s 转换为一个列列表
chr(x ) 将一个整数转换为一个Unicode字符
ord(x ) 将一个字符转换为它的ASCII整数值
hex(x ) 将一个整数转换为一个十六进制字符串串
oct(x ) 将一个整数转换为一个八进制字符串串
bin(x ) 将一个整数转换为一个二进制字符串串

输入和输出

生活中无时无刻其实都存在输入和输出的例子,我们先举例看一下生活中有哪些输入输出的情况,在来对比Python中的输入输出和生活中的有什么相同和不同之处。

生活中的输出

我们经常会去电影院看电影,我们从电影院屏幕中获取影片的内容来观看影片,而影片的放映室经过投影仪""照射""到大屏幕,同样的也可以说是投影仪把影片输出到大荧幕上来供我们观看,这就是生活中最简单的输出方式。

Python中的输出

Python中的输出和生活中的输出是一样的原理理,只不不过Python中的输出,特指是在控制台中输出,或 者是将你准备要输出的内容相应的输出到你的设备上,如你在手机上看到的文字、图片、视频等数据,其 实本质上也是我们敲打代码输出到手机上的.那我们先来看一下第一种,如何将你想要输出文字输出到控制台.

例如我们将一段文字"Hello World"输出到控制台,这里面利用的 print() 函数进行输出,以后我们会讲到函数的概念,先暂时知道print()可以帮助我们进行输出。

print('hello world')

右键点击选择 Run 和你对应的要运⾏行的⽂文件名字就可以运⾏行刚刚的输出代码

我们在图⽚片最下方看见的输出结果为hello world 输出的位置就是控制台

我们可以试试输出100+100会是什什么结果

print(100+100)

生活中的输入

生活中的输入无处不在,例如你需要在各种软件中输入的账号密码,去ATM机器取钱也同样需要输入密码。

Python中的输入

和输出同理理我们也可用到控制台来记录输入结果,同样用到一个函数 input() ,我们可以利用这段代码在控制台输入,然后在利用刚刚学的 print() 函数把你输入的结果在输出来。

name=input()
print(name)

当你运行完毕 name = input () 代码并将鼠标光标移动到控制台,Python交互式命令就在等你的输入了,你可以输入任意字符,然后按回车完成输入。

格式化输出

# 格式化符号:%s,%d,%f,%x
# %s:输出字符串
# %d:输出int类型数字
# %f:输出浮点数
# %x:输出16进制数据

score=100
print('python成绩为:%d'% sore)

if语句

计算机之所以能做很多⾃自动化的任务,因为它可以自己做条件判断。

比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用 if 语句实现:

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

根据Python的缩进规则,如果 if 语句判断是 True ,就把缩进的两行print语句执行了,否则,什么也不做。

也可以给 if 添加一个 else 语句,意思是,如果 if 判断是 False ,不要执行 if 的内容,去把 else 执行了:

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

注意不不要少写了冒号: 。

当然上面的判断是很粗略的,完全可以用 elif 做更细致的判断:

age = 3
if age >= 18:
    print('adult') 
elif age >= 6:
    print('teenager') 
else:
    print('kid')

elif 是else if 的缩写,完全可以有多个 elif ,所以 if 语句的完整形式就是:

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

if 语句执行有个特点,它是从上往下判断,如果在某个判断上是 True ,把该判断对应的语句执行后, 就忽略掉剩下的elif 和 else ,所以,请测试并解释为什么下面的程序打印的是 teenager :

age = 20
if age >= 6:
    print('teenager') 
elif age >= 18:
    print('adult') 
else:
    print('kid')

运算符

算数运算符

Python支持以下几种运算符:

运算符 描述 实例
+ 两个对象相加 a + b 输出结果 30
- 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 两个数相乘或是返回一个被重复若⼲干次的字符串串 a * b 输出结果 200
/ b / a 输出结果 2
// 取整除 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
% 取余 返回除法的余数 b % a 输出结果 0
** 指数 a**b 为10的20次方, 输出结果 100000000000000000000

混合运算时,优先级顺序为:(*)高于()(/)(%)(//)高于(+)(-) 为了避免歧义,建议使用 () 来处理运算符优先级。并且,不同类型的数字在进行混合运算时,整数将会转换成浮点数进行运算。

赋值运算符

运算符 描述 实例
= 赋值运算符 把 = 号右边的结果 赋给 左边的变量,如 num = 1 + 2 * 3,结果num的值为7
# 单个变量赋值
num = 10

# 多个变量赋值
num1, num2, f1, str1 = 100, 200, 3.14, "hello"

复合赋值运算符

运算符 描述 实例例
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c** = a 等效于 c = c a
//= 取整除赋值运算符 c //= a 等效于 c = c // a

循环

我们来试想这样一种情况,现在让你们在控制台输出100条hello world ,本质上,我们写一百条 print 函数输出就可以了,但是如果一千条一万条呢.这就要用到循环语句了.

while循环

while循环语句语法

while 条件:
    条件满足时,做的事情1 
    条件满足时,做的事情2 
    条件满足时,做的事情3

例例如输出100条 hello world

i = 100
whiel i <=100:
    print('hello world')
    i + 1

相对应,在while循环语句里面,每执行一次循环语句, i 就会加1,直到i 等于101时不满足 i<=100 的条件,循环就结束了

for循环

for循环和while一样同样可以进行循环,并且是运用最多的循环方式,而且它有一项非常厉害的功能——遍历 ,在Python中 for 循环可以遍历任何序列项目,如字符串,或者今后会学到的列表,例如我们遍历字符串,就特指将字符串的所有字符全部访问一遍

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

执行这段代码,会依次打印 names 的每一个元素:

Michael 
Bob 
Tracy

所以for x in ... 循环就是把每个元素代入变量x ,然后执行缩进块的语句。再比如我们想计算1-10的整数之和,可以用一个 sum 变量做累加:

sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    sum = sum + x 
    print(sum)

Python还提供了一个range()函数,可以配合我们的for循环使用,例如:

for i in range(5): 
    print(i)

#效果等同于 while 循环的:

i = 0
while i < 5:
    print(i) 
    i += 1

我们在来学习两个关键字 breake continue ,这两个关键字是我们循环语句的好帮手

break

在循环中, break 语句可以提前退出循环。例如,本来要循环打印1~100的数字:

n = 1
while n <= 100: 
    print(n)
    n = n + 1 
print('END')

上面的代码可以打印出1~100。

如果要提前结束循环,可以用 break 语句:

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

执行上面的代码可以看到,打印出1~10后,紧接着打印 END ,程序结束。可见 break 的作用是提前结束循环。

continue

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

n = 0
while n < 10:
    n = n + 1 
    print(n)

上面的程序可以打印出1~10。但是,如果我们想只打印奇数,可以用 continue 语句跳过某些循环:

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

执行上面的代码可以看到,打印的不再是1~10,而是1,3,5,7,9。 可见 continue 的作用是提前结束本轮循环,并直接开始下一轮循环。

2020/02/21 posted in  基础

6. python包的使用及读写

捕获异常

一旦出错,还要一级一级上报,直到某个函数可以处理该错误(比如,给用户输出一个错误信息)。所以高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。 让我们用一个例子来看看try的机制:

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e: 
    print('except:', e)
finally:
    print('finally...') 
print('END')
try...
except: division by zero
finally...
END

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是 直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

上面的代码在计算10 / 0时会产生一个除法运算错误:

try...
except: division by zero finally...
END

从输出可以看到,当错误发生时,后续语句print('result:', r)不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。

如果把除数0改成2,则执行结果如下:

try...
result: 5 
finally... 
END

由于没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。

你还可以猜测,错误应该有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理。没错,可以 有多个except来捕获不同类型的错误:

try:
    print('try...') 
    r = 10 / int('a')
    print('result:', r) 
except ValueError as e:
    print('ValueError:', e) 
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e) 
finally:
    print('finally...') 
print('END')

int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError。

此外,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:

try:
    print('try...') 
    r = 10 / int('2')
    print('result:', r) 
except ValueError as e:
    print('ValueError:', e) 
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e) 
else:
    print('no error!') 
finally:
    print('finally...') 
print('END')

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是, 它不但捕获该类型的错误,还把其子类也“一网打尽”。比如:

try:
    foo()
except ValueError as e: 
    print('ValueError')
except UnicodeError as e: 
    print('UnicodeError')

第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了。

Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系

使用try...except捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo(),foo() 调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e: 
        print('Error:', e)
    finally:
        print('finally...')

也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。

python所有的标准异常类:

异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
SystemExit Python 解释器请求退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
KeyboardInterrupt 用户中断执行(通常是输入C)
LookupError 无效数据查询的基类
IndexError 序列中没有没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

模块

模块:通俗理解一个.py文件就是一个模块,模块是管理功能代码的。

内置模块:就是python自己内部自带的不需要我们去下载的模块, 比如:time, random等。

自定义模块的使用

注意:自定义模块名字和变量名的定义很类似,都是由字母、数字、下划线组成,但是不能以数字开头,否则无法导入该模块。

创建名为first_module的自定义模块

__all__= ["g_num", "show"]
# 指定 all 表示 from 模块名 import * 只能使用指定的功能代码,而不是所有的功能代码
# 定义全局变量
g_num = 10
# 定义函数 
def show():
    print("我是一个函数")
# 定义类
class Student(object):
    def init (self, name, age): 
        self.name = name
        self.age = age 
    
    def show_msg(self):
        print(self.name, self.age)
# 解决导入的模块中方法没有调用就会执行
if __name__== '__main__': 
    show()
我是一个函数

使用自定义的模块

# 导入模块
import first_module
# 使用模块中的功能代码
print(first_module.g_num) first_module.show()
stu = first_module.Student("李四", 20)
stu.show_msg()

注意:使用 name 查看模块名,执行哪个文件,哪个文件中的__name__输出__main__ , 其他导入模块中的__name__结果就是模块名字。

模块导入的注意点:

  1. 自定义的模块名不要和系统的模块名重名,
  2. 导入的功能代码不要在当前模块定义否则使用不了导入模块的功能代码

包的介绍

包:通俗理解包就是一个文件夹,只不过文件夹里面有一个init.py文件,包是管理模块的, 模块是管理功能代码的。

# -----import导入包里面的模块----
import first_package.first

#-----import导入包里面的模块设置别名----
import first_package.first as one

#----from导入包名 import 模块名----
from first_package import second

#--- from 包名.模块名 import 功能代码----
from first_package.first import show    # 需要保证当前模块没有导入模块的功能代码
# --- from 包名 import *, 默认不会导入包里面的所有模块,需要在init文件里面使用   all  去指定导入的模块
from first_package import *

__init__文件写法
# 如果外界使用from 包名 import * 不会导入包里面的所有模块,需要使用 all 指定
     all    = ["first", "second"]
# 从当前包导入对应的模块
from . import first from . import second

文件基础操作

文件简介

文件包括文本文件和二进制文件(声音,图像,视频) 从存储方式来说,文件在磁盘上的存储方式都是二进制形式, 所以,文本文件其实也应该算二进制文件。先从他们的区别来说,虽然都是二进制文件,但是二进制代表的意思不一 样。打个比方,一个人,我们可以叫他的大名,以叫他的小名,但其实都是代表这个人。二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。

读文件

要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:

f = open('/Users/michael/test.txt', 'r')

标示符'r'表示读,这样,我们就成功地打开了一个文件。

如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:

f=open('/Users/michael/notfound.txt', 'r')
---------------------------------------------------------------------------

FileNotFoundError                         Traceback (most recent call last)

<ipython-input-115-56fe20145a26> in <module>()
----> 1 f=open('/Users/michael/notfound.txt', 'r')


FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'

如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str 对象表示:

f.read() 'Hello, world!'

最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操 作系统同一时间能打开的文件数量也是有限的:

f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:
    f = open('/path/to/file', 'r') 
    print(f.read())
finally:
    if f:
        f.close()

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

with open('/path/to/file', 'r') as f:
    print(f.read())

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便

for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

文件的打开方式

模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该 文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入 到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
 f.read()
'测试'

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的 字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

f = open('/Users/michael/test.txt', 'w')
f.write('Hello, world!')
f.close()

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不 会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

所以,还是用with语句来得保险:

with open('/Users/michael/test.txt', 'w') as f: f.write('Hello, world!')

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。

注意:以'w'模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果我们希望追加到文件末尾怎么办?可以传入'a'以追加(append)模式写入。

2020/02/21 posted in  基础

3. python数据类型

字符串(str)

字符串的定义

我们在介绍数据类型的时候,简单介绍了一下字符串类型.因为字符串是Python语言中特别重要的概念(不仅是Python,在其他语言中也有着举重若轻的位置),我们详细的讲解一下字符串的用法。

我们已经知道了,单引号,双引号,包括三引号包围的字符组,就是字符串,例如

str = 'hello'#定义字符串变量
str = "helo"#定义字符串变量
str = """hello
hello"""#定义多行字符串变量

下标和切片

下标索引

下标在Python中的概念就是编号的意思, 字符串 元组 列表 都会经常用到下标的概念,我们可以根据下标找到它们所对应的元素.就好像生活中你要准备去看电影,电影票上的座位号找到对应的位置。

我们现在考虑这样⼀一个问题,例例如我们创建了一个字符串name = zhang ,我现在想取到名为 name 字符串里面的a字符.如何去取呢?,其实我们可以通过我们讲过的for循环来遍历这个字符串,通过这种方法来取出字符串里的字符,但是 Python 给我们提供了了更为简便的方法,我们就可以用下标来取出a 字符

name='zhangsan'
print(name[2])
a

切片

我们可以利用下表索引取到字符串里面对应的一个元素,但如果想要截取一段元素就要用到切片。

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。 切片的语法: [起始:结束:步长]
我们以字符串为例例讲解。

如果取出一部分,则可以在中括号 [] 中,使用:

name = 'abcdef'
print(name[0:3]) # 取 下标0~2 的字符
print(name[3:5]) # 取 下标为3、4 的字符
print(name[2:]) # 取 下标为2开始到最后的字符
#支持负数
name = 'abcdef'
print(name[1:-1]) # 取  下标为1开始  到  最后第2个 之间的字符
abc
de
cdef
bcde

字符串的常见操作

如有字符串mystr = 'hello world kkb' ,以下是常见的操作

mystr = 'hello world kkb'

find

检测 是否包含在 mystr中,如果是返回开始的索引值,否则返回-1

mystr.find(str, start=0, end=len(mystr))

mystr.find('kkb')
12
mystr.find('kkb',0,10)#在mstr字符串串0-10下标范围查询
-1

index

跟 find() 方法一样,只不过如果 str 不在 mystr中会报一个异常.

mystr.index(str, start=0, end=len(mystr))

mystr.index('ab')
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-9-46892962653f> in <module>()
----> 1 mystr.index('ab')


ValueError: substring not found

count

返回str在start和end之间在mystr里面出现的次数。

mystr.count(str,start,end=len(mystr))
mystr.count('kkb')

1

replce

把mystr中的str1替换成str2 ,如果count指定,则替换不超过count次。

mystr.replace(str1,str2,mystr.count(str1))

split

以str为分隔符切片 mystr,如果maxsplit有指定值,则仅分隔maxsplit个子字符串。

mystr.split(str=" ", 2)

capitallize

把字符串的第一个字母大写

mystr.capitalize()

'Hello world kkb'

title

首字母大写

mystr.title()

'Hello World Kkb'

startswith

检查字符串是否是以hello开头, 是则返回True,否则返False

mystr.startswith('hello')

True

endswith

检查字符串是否以obj结尾,如果是则返回True,否则返False

mystr.endswith('obj')

False

lower

转换mystr中所有大写字符为小写

mystr.lower()

upper

转换mystr中所有小写字符为大写

mystr.upper()

ljust

返回一个原字符串左对齐,并使用空格填充至长度width的新字符串

width=32
mystr.ljust(width)

'hello world kkb                 '

rjust

返回一个原字符串右对齐,并使用空格填充至长度width的新字符串

mystr.rjust(width)

center

返回一个原字符串居中对齐,并使用空格填充至长度width的新字符串

mystr.center()

lstrip

删除mystr左边的空白字符串

mystr.lstrip()

rstrip

删除mystr右边的空白字符串

mystr.rstrip()

strip

删除mystr两端的空白字符串

mystr.strip()

a = "\n\t kkb \t\n" 
print(a)
a.strip()

     kkb    



'kkb'

rfind

类似于 find() 函数,不不过是从右边开始查找.

mystr.find(str, start=0,end=len(mystr))

rindex

类似于 index() ,不不过是从右边开始.

mystr.rindex(str, start=0,end=len(mystr))

partition

把 mystr以str分割成三部分, str前, str和str后

mystr.partition(str)

rpartition

类似于 partition()函数,不不过是从右边开始.

mystr.rpartition(str)

splitlines

按照行分隔,返回一个包含各行作为元素的列表

mystr.splitlines()

join

mystr中每个元素后面插入 str ,构造出⼀一个新的字符串

mystr.jion(str)

列表(list)

列表简介

Python内置的一种数据类型是列表: list 。 list 是一种有序的集合,可以随时添加和删除其中的元素,写在方括号之间、用逗号分隔开的数值列表。列表内的项目不必全是相同的类型。

例如:

list1= ['spam','eggs','12',123]

注意:比C语言的数组强大的地方在于列表中的元素可以是不同类型的。

列表的常见操作

列表的长度

#⽤用len()函数可以获得list元素的个数:
namesList = ['xiaoWang','xiaoZhang','xiaoHua'] 
len(namesList)

3

列表的访问

用索引来访问 list 中每一个位置的元素,记得索引是从0开始的

namesList = ['xiaoWang','xiaoZhang','xiaoHua'] 
print(namesList[0])
print(namesList[1]) 
print(namesList[2]) 
print(namesList[3])

xiaoWang
xiaoZhang
xiaoHua




---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-42-c578a48b9b76> in <module>()
      3 print(namesList[1])
      4 print(namesList[2])
----> 5 print(namesList[3])



IndexError: list index out of range

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

如果要取最后一个元素,除了了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:

print(namesList[-1])
#以此类推,可以获取倒数第2个、倒数第3个:
print(namesList[-2])
print(namesList[-3])

xiaoHua
xiaoZhang
xiaoWang

列表的切片

切片: 根据下标的范围获取一部分数据,⽐比如: 列表,字符串可以使用切片。

切片的使用格式

数据[起始下标:结束下标:步长]

提示: 起始下标默认0, 结束下标是不包含, 步长默认是1

# 使用切片的方式获取一部分数据
my_str=['zhangsan','lisi','wangwu',45,781,'erf']
result = my_str[1:4:1]
print(result)

#前三个
result = my_str[0:3] 
print(result)
result = my_str[:3] 
print(result)

['lisi', 'wangwu', 45]
['zhangsan', 'lisi', 'wangwu']
['zhangsan', 'lisi', 'wangwu']

添加元素( append , extend , insert )

通过 append 可以向列列表添加元素

#定义变量量A,默认有3个元素
A = ['xiaoWang','xiaoZhang','xiaoHua']

print("-----添加之前,列列表A的数据    ")

for tempName in A: 
    print(tempName)
#提示、并添加元素
temp = input('请输入要添加的学生姓名:') 
A.append(temp)

print("-----添加之后,列列表A的数据    ")
for tempName in A:
    print(tempName)


-----添加之前,列列表A的数据   
xiaoWang
xiaoZhang
xiaoHua
请输入要添加的学生姓名:huohuo
-----添加之后,列列表A的数据   
xiaoWang
xiaoZhang
xiaoHua
huohuo

通过 extend 可以将另⼀一个集合中的元素逐⼀一添加到列列表中

a = [1, 2]
b = [3, 4]
a.append(b)
print(a)
print('-----')
a.extend(b)
print(a)
print('-----')
# insert(index,object)` 在指定位置`index`前插入元素`object

a = [0, 1, 2]
a.insert(1, 3)
print(a)

[1, 2, [3, 4]]
-----
[1, 2, [3, 4], 3, 4]
-----
[0, 3, 1, 2]

修改元素

修改元素的时候,要通过下标来确定要修改的是哪个元素,然后才能进行修改

#定义变量量A,默认有3个元素
A = ['xiaoWang','xiaoZhang','xiaoHua']

print("-----修改之前,列列表A的数据    ")
for tempName in A: print(tempName)

#修改元素
A[1] = 'xiaoLu'

print("-----修改之后,列列表A的数据    ")
for tempName in A: print(tempName)


-----修改之前,列列表A的数据   
xiaoWang
xiaoZhang
xiaoHua
-----修改之后,列列表A的数据   
xiaoWang
xiaoLu
xiaoHua

查找元素

所谓的查找,就是看看指定的元素是否存在。

python中查找的常用方法为:

  • in (存在),如果存在那么结果为 true ,否则为 false

  • not in (不存在),如果不存在那么结果为 true ,否则 false

#待查找的列表
nameList = ['xiaoWang','xiaoZhang','xiaoHua']

#获取用户要查找的名字
findName = input('请输入要查找的姓名:')

#查找是否存在
if findName in nameList:
    print('在字典中找到了了相同的名字')
else:
    print('没有找到')

请输入要查找的姓名:Ryan
没有找到

index 和 count 与字符串中的用法相同

a = ['a', 'b', 'c', 'a', 'b']
a.index('a', 1, 3) # 注意左闭右开区间

---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-2-5317aed0f6cc> in <module>()
      1 a = ['a', 'b', 'c', 'a', 'b']
----> 2 a.index('a', 1, 3) # 注意左闭右开区间



ValueError: 'a' is not in list
a.index('a',1,4)

3
a.count('b')

2

删除元素

列表元素的常用删除方法有:

  • del:根据下标进行删除pop:

  • 删除最后一个元素remove:

  • 根据元素的值进行删除

  1. del
list1 = ['a','b','c','d','e','f']

print('------删除之前')
for tempName in list1:
    print(tempName)

movieName=list1  
del movieName[2]

print('------ 删除之后 ')
for tempName in list1:
    print(tempName)

------删除之前
a
b
c
d
e
f
------ 删除之后 
a
b
d
e
f
  1. pop
list2 = ['a','b','c','d','e','f']

print('------删除之前   ')
for tempName in list2:
    print(tempName)

movieName=list2  
movieName.pop()


print('------删除之后   ')
for tempName in list2:
    print(tempName)


------删除之前  
a
b
c
d
e
f
------删除之后  
a
b
c
d
e
  1. remove
list2 = ['a','b','c','d','e','f']

print('------删除之前   ')
for tempName in list2:
    print(tempName)

movieName=list2  
movieName.remove('e')


print('------删除之后   ')
for tempName in list2:
    print(tempName)

------删除之前  
a
b
c
d
e
f
------删除之后  
a
b
c
d
f
  1. 排序
    sort 方法是将 list 按特定顺序重新排列,默认为由小到大,参数 reverse=True 可改为倒序,由大到小。

    reverse 方法是将 list 逆置。

a=[1,4,3,2]
print(a)
a.sort()
print(a)

[1, 4, 3, 2]
[1, 2, 3, 4]
a=[1,4,3,2]
print(a)
a.reverse()
print(a)

[1, 4, 3, 2]
[2, 3, 4, 1]
a=[1,4,3,2]
print(a)
print('-----')
a.sort(reverse=True)
print(a)
print('-----')
a.sort(reverse=False)
print(a)

[1, 4, 3, 2]
-----
[4, 3, 2, 1]
-----
[1, 2, 3, 4]

列表的遍历

使用for循环

为了更有效率的输出列表的每个数据,可以使用循环来完成

namesList = ['xiaoWang','xiaoZhang','xiaoHua'] 
for name in namesList:
    print(name)

xiaoWang
xiaoZhang
xiaoHua

使用while循环

为了更有效率的输出列表的每个数据,可以使用循环来完成

namesList = ['xiaoWang','xiaoZhang','xiaoHua'] 
lenth=len(namesList)
i=0
while i < lenth:
    print(namesList[i])
    i+=1

xiaoWang
xiaoZhang
xiaoHua

元组(tuple)

另一种有序列列表叫元组:tuple。 tuple和list非常类似,但是 tuple一旦初始化就不能修改,比如同样是列出同学的名字:

classmates = ('Michael', 'Bob', 'Tracy')

现在, classmates这个tuple不能变了,它也没有append(),insert( )这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用 classmates[0] , classmates[-1] ,但不能赋值成另外的元素。

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

如果要定义一个空的tuple,可以写成():

t=()
print(t,type(t))

() <class 'tuple'>

但是,要定义一个只有1个元素的tuple ,如果你这么定义:

t=(1)
print(t,type(t))

1 <class 'int'>

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这 就产生了了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。

所以,只有1个元素的tuple定义时必须加一个逗号,来消除歧义:

t=(1,)
print(t,type(t))

(1,) <class 'tuple'>

Python在显示只有1个元素的tuple时,也会加一个逗号,以免你误解成数学计算意义上的括号。

t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
t

('a', 'b', ['X', 'Y'])

最后来看一个“可变的”tuple

字典(dict)

字典简介

字典是另一种可变容器器模型,且可存储任意类型对象。

字典的每个键值(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

由于一个 key 只能对应⼀一个 value ,所以,多次对一个 key 放入 value ,后面的值会把前面的值冲掉:

d['Ryan']=100
d['Ryan']

100
d['Ryan']=99
d['Ryan']

99

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

d['Thomas']

---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-40-bf27a9c462ee> in <module>()
----> 1 d['Thomas']



KeyError: 'Thomas'

字典的常见操作

修改元素

字典的每个元素中的数据是可以修改的,只要通过 key 找到,即可修改

info = {'name':'kkb', 'id':100, 'sex':'f', 'address':'中国北北京'}
new_id = input('请输入新的学号:')
info['id'] = int(new_id)
print('修改之后的id为: %d' % info['id'])

请输入新的学号:12
修改之后的id为: 12

添加元素

  1. 访问不不存在的元素
info = {'name':'kkb', 'sex':'f', 'address':'中国北北京'}
print('id为:%d' % info['id'])

---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-43-0f8e22620be6> in <module>()
      1 #访问不不存在的元素
      2 info = {'name':'kkb', 'sex':'f', 'address':'中国北北京'}
----> 3 print('id为:%d' % info['id'])



KeyError: 'id'

如果在使用变量量名['键'] = 数据 时,这个“键”在字典中,不存在,那么就会新增这个元素。

  1. 添加新的元素
info = {'name':'kkb', 'sex':'f', 'address':'中国北北京'}
# print('id为:%d'%info['id'])#程序会终端运⾏行行,因为访问了了不不存在的键
newId = input('请输入新的学号:')
info['id'] =int(newId)

print('添加之后的id为:%d' % info['id'])

请输入新的学号:345
添加之后的id为:345
  1. 删除元素
    对字典进行删除操作,有以一下几种:

  • del
  • clear()

del删除指定的元素

info = {'name':'kkb', 'sex':'f', 'address':'中国北北京'}

print('删除前,%s' % info['name'])

del info[name]

print('删除后,%s' % info['name'])
#删除后不存在name字段

删除前,kkb


---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-55-02d163400996> in <module>()
      3 print('删除前,%s' % info['name'])
      4 
----> 5 del info[name]
      6 
      7 print('删除后,%s' % info['name'])



KeyError: 'xiaoHua'

del删除整个字典

info = {'name':'monitor', 'sex':'f', 'address':'China'}
print('删除前,%s' % info)
del info
print('删除后,%s' % info)

clear清空整个字典

info = {'name':'monitor', 'sex':'f', 'address':'China'}
print('清空前,%s' % info)
info.clear()
print('删除后,%s' % info)

keys

返回一个包含字典所有key的列列表

d1 = {'name':'abc','age':'18', 'class':'cnh'} 
print(list(d1.keys()))

['name', 'age', 'class']

values

返回一个包含字典所有value的列表

d1 = {'name':'abc','age':'18', 'class':'cnh'} 
print(list(d1.values()))

['abc', '18', 'cnh']

items
返回一个包含所有(值,键)元祖的列表

d1 = {'name':'abc','age':'18', 'class':'cnh'} 
print(list(d1.items()))

[('name', 'abc'), ('age', '18'), ('class', 'cnh')]

集合(set)

集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不不是 { },因为 { }是用来创建⼀一个空字典。

my_set = {1, 4, 'abc', 'hello'}
# 不支持下标赋值和取值
# my_set[0] = 3
# value = my_set[0] # print(value)
# print(value)

#支持通过遍历获取数据
for value in my_set:
    print(value)

1
hello
4
abc
my_set2={1,4,7}
for index,value in enumerate(my_set2):
    print(index,value)

0 1
1 4
2 7
# 定义空的集合的时候不能直接使用{}
my_set = set()
my_set.add(1) 
my_set.add(1)
print(my_set, type(my_set))

# 集合可以对容器器类型数据去重
my_list = [1, 1, 3, 5, 3]
# 把列列表转成集合,会把数据去重
my_set = set(my_list)
print(my_set)

# 列列表,元组, 集合 三者之间可以相互转换
my_tuple = (5, 3)
print(my_tuple, type(my_tuple))


{1} <class 'set'>
{1, 3, 5}
(5, 3) <class 'tuple'>
2020/02/21 posted in  基础