python是一门编程语言。python的解释器pycharm。

一、安装和部署

1.1 安装Python工具

https://www.python.org/

在官网上下载工具,然后安装。

安装pycharm

https://pycharm.zuitie.cn/?bd_vid=8472754158287571923

二、Python基础

2.1 语句

2.1.1 输出语句

采用print输出

print('你好Python')

2.1.2 输入input

采用input输入,可以接收输入结果

name = input('请输入你的名字:')
print(name)

用户输入后,回车键返回,将输入结果赋值给name。

input输出的结果是字符串.

type获取数据类型
# input输出的结果是字符串

c = input("请输入第一个数字:")

# 可以使用type运算符得到变量类型

print(type(c))

<class 'str'>

说明c是字符串类型

数据类型转换

# py基本数据类型转换逻辑:

# 想把谁转换为xxx, 就用xxx 套谁

#   想把谁转换为xxx, 就用xxx 套谁
#   str => int.  int(str)
c = int(c)

c转换为int类型。

2.1.3 注释语句

采用# 注释语句。

# 输入(增加提示语)
name = input('请输入你的名字:')
print(name)

注释是对代码进行解释和说明,是给人看的。

单行注释

采用#对单行进行注释。

多行注释

采用 """ """或者 ''' '''进行多行注释

"""
多行注释

"""

2.2 字面量

Python 字面量‌是指直接在源代码中写下的固定值,无需通过变量或计算即可被解释器识别和使用 。它是 Python 程序中最基本的数据表示形式,涵盖了数字、字符串、布尔值、空值及容器等多种类型 。‌‌可以理解为常量。

2.3 变量

变量是存储在内存中的值,这就意味着在创建变量时会在内存中开辟一个空间。

变量赋值

语法:

变量名 = 变量值

counter = 100 # 赋值整型变量

多个变量赋值

Python允许你同时为多个变量赋值。例如:

a = b = c = 1

标准数据类型(变量类型)

在内存中存储的数据可以有多种类型。

例如,一个人的年龄可以用数字来存储,他的名字可以用字符来存储。

Python 定义了一些标准类型,用于存储各种类型的数据。

Python有五个标准的数据类型:

  • Numbers(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Dictionary(字典)

Python支持四种不同的数字类型:

  • int(有符号整型)
  • long(长整型,也可以代表八进制和十六进制)
  • float(浮点型)
  • complex(复数)

2.4 常量

所有大写字母的变量可以看做常量。

# 没有严格意义上的常量。

PI = 3.1415926

print(PI)

# 约定为常量,也可以改变值

PI = 3

print(PI)

2.5 条件语句

if 语句的判断条件可以用>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)来表示其关系。

当判断条件为多个值时,可以使用以下形式:

if 判断条件1:
    执行语句1……
elif 判断条件2:
    执行语句2……
elif 判断条件3:
    执行语句3……
else:
    执行语句4……

简单的语句组

你也可以在同一行的位置上使用if条件判断语句

if ( var  == 100 ) : print "变量 var 的值为100" 

2.6 循环语句

让语句重复执行。

2.6.1 while循环

语法:

while 条件:
    循环体代码

例如计算:1-2+3-4....-100=?

# 计算 1-2+3-4...-100=?
i = 1
v = 1
s = 0
sign = 1
while i<=100:
    s = s + v
    i = i + 1
    if v > 0:
        sign = -1
    else:
        sign = 1
    v = i * sign
    print("s=" + format(s) + " v=" +format(v) + " i=" + format(i))

print(s)

2.6.2 立即停止循环break

2.6.3 停止当前一轮循环continue

continue停止当前一轮循环继续下一轮.

2.6.4 for循环

语法:

for 变量 in 可迭代的东西:

        循环体

for循环可以遍历集合。

for循环用于计数

range(n): 从0~n-1.区间是前开后闭的区间

for i in range(10): # 0~9

        print(i)

range(m,n): 从m~(n-1).区间循环
range(m,n,step): 从m~(n-1).区间循环,步长step
pass占位

循环体未实现的情况下,先占位,可以采用pass

for i in range(10):

        pass

2.7 基础数据类型

2.7.1 数字类型Number

Python Number 数据类型用于存储数值。

数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。

delete删除引用

您也可以使用del语句删除一些 Number 对象引用。

del语句的语法是:

del var1[,var2[,var3[....,varN]]]]
四种数值类型

Python 支持四种不同的数值类型:

  • 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。
  • 长整型(long integers) - 无限大小的整数,整数最后是一个大写或小写的L。
  • 浮点型(floating point real values) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
  • 复数(complex numbers) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

  • 长整型也可以使用小写"L",但是还是建议您使用大写"L",避免与数字"1"混淆。Python使用"L"来显示长整型。
  • Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型

2.7.2 Python Number 类型转换

int(x [,base ])         将x转换为一个整数  
long(x [,base ])        将x转换为一个长整数  
float(x )               将x转换到一个浮点数  
complex(real [,imag ])  创建一个复数  
str(x )                 将对象 x 转换为字符串  
repr(x )                将对象 x 转换为表达式字符串  
eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象  
tuple(s )               将序列 s 转换为一个元组  
list(s )                将序列 s 转换为一个列表  
chr(x )                 将一个整数转换为一个字符  
unichr(x )              将一个整数转换为Unicode字符  
ord(x )                 将一个字符转换为它的整数值  
hex(x )                 将一个整数转换为一个十六进制字符串  
oct(x )                 将一个整数转换为一个八进制字符串  
# 字符串转整数 int
a = "200"
b = int(a)
print("转换后的类型:", type(b)) #  <class 'int'>

2.7.3 数学计算模块math及cmath

Python 中数学运算常用的函数基本都在 math 模块、cmath 模块中。

Python math 模块提供了许多对浮点数的数学运算函数。

Python cmath 模块包含了一些用于复数运算的函数。

cmath 模块的函数跟 math 模块函数基本一致,区别是 cmath 模块运算的是复数,math 模块运算的是数学运算。

math中的函数:

>>> import math
>>> dir(math)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign',
'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial',
'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose',
'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p',
'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt',
'tan', 'tanh', 'tau', 'trunc']
>>>

查看 cmath 查看包中的内容:

>>> import cmath
>>> dir(cmath)
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__',
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos', 'cosh', 'e',
'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log',
'log10', 'nan', 'nanj', 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh',
'sqrt', 'tan', 'tanh', 'tau']
>>>

2.7.4 Python数学函数

函数 返回值 ( 描述 )
abs(x) 返回数字的绝对值,如abs(-10) 返回 10
ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1
exp(x) 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x) 以浮点数形式返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x) 返回数字的下舍整数,如math.floor(4.9)返回 4
log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x) 返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,...) 返回给定参数的最大值,参数可以为序列。
min(x1, x2,...) 返回给定参数的最小值,参数可以为序列。
modf(x) 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y) x**y 运算后的值。
round(x [,n]) 返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。
sqrt(x) 返回数字x的平方根

2.7.5 Python随机数函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

Python包含以下常用随机数函数:

函数 描述
choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random() 随机生成下一个实数,它在[0,1)范围内。
seed([x]) 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst) 将序列的所有元素随机排序
uniform(x, y) 随机生成下一个实数,它在[x,y]范围内。

2.7.6 Python三角函数

Python包括以下三角函数:

函数 描述
acos(x) 返回x的反余弦弧度值。
asin(x) 返回x的反正弦弧度值。
atan(x) 返回x的反正切弧度值。
atan2(y, x) 返回给定的 X 及 Y 坐标值的反正切值。
cos(x) 返回x的弧度的余弦值。
hypot(x, y) 返回欧几里德范数 sqrt(x*x + y*y)。
sin(x) 返回的x弧度的正弦值。
tan(x) 返回x弧度的正切值。
degrees(x) 将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x) 将角度转换为弧度

2.7.7 Python数学常量

常量 描述
pi 数学常量 pi(圆周率,一般以π来表示)
e 数学常量 e,e即自然常数(自然常数)。

2.7.8 字符串

字符串是 Python 中最常用的数据类型。我们可以使用引号 ( ' 或 " ) 来创建字符串。

创建字符串很简单,只要为变量分配一个值即可。例如:

var1 = 'Hello World!'
var2 = "Python Runoob"
2.7.8.1 访问字符串的值

字符串子串的访问。

Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。

Python 访问子字符串,可以使用方括号来截取字符串,如下实例:

var1 = 'Hello World!'
var2 = "Python Runoob"
 
print "var1[0]: ", var1[0]
print "var2[1:5]: ", var2[1:5]

# 输出结果
var1[0]:  H
var2[1:5]:  ytho

# var1[0]的类型是<class 'str'>
print(type(var1[0]))

截取前N个字符子串的语法:

str[:N]: 截取前[0,n) 个字符的子串;

str[m:]: 截取从m开始的[m, len)子串。

str[startIndex:endIndex:step]: 获取从[startIndex, endIndex)的子串,按照step抽取字符。

# 截取从0~5的子串,步长为2,结果:Hlo

print("var1[0:5:2]: ", var1[0:5:2])

获取尾部的子串

采用负数标记从尾部计数下标的子串。

最末尾的字符的索引开始,往左一个位置则-1

# 获取末尾3个字符的子串

print("var1[-3:]: ", var1[-3:])

2.7.8.2 字符串格式化

字符串进行格式化输出。

类型一:百分号占位格式

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。

# 类型一:采用百分号占位
print("My name is %s and weight is %d kg!" % ('Lucky', 21) )

python 字符串格式化符号:

    符   号 描述
      %c  格式化字符及其ASCII码
      %s  格式化字符串
      %d  格式化整数
      %u  格式化无符号整型
      %o  格式化无符号八进制数
      %x  格式化无符号十六进制数
      %X  格式化无符号十六进制数(大写)
      %f  格式化浮点数字,可指定小数点后的精度
      %e  用科学计数法格式化浮点数
      %E  作用同%e,用科学计数法格式化浮点数
      %g  %f和%e的简写
      %G  %F 和 %E 的简写
      %p  用十六进制数格式化变量的地址

语法结构:

"格式化字符串" % (参数列表,采用逗号分隔)
类型二:format格式化

参数采用{}占位,

 语法:参数采用{} 占位

"格式化字符串".format(参数列表)

例如:

# 类型二:采用format格式化
name = "李磊"
age = 21
print("我是{}, 我今年{}".format(name, age))
类型三:f-string方式

f-string方式类似于字符串模版,将格式化字符串与参数一起拼接,减少参数类型对应的麻烦。

与format类型,也是采用{}进行参数占位,括号中直接写参数名称。

格式化字符串之前“f”标记为 f-string 方式。

# 类型三:f-string方式
print(f"我是{name}, 我今年{age}")

输出:

我是李磊, 我今年21

2.7.8.3 字符串内建函数

目前字符串内建支持的方法,所有的方法都包含了对 Unicode 的支持,有一些甚至是专门用于 Unicode 的。

方法 描述

string.capitalize()

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

string.center(width)

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

string.count(str, beg=0, end=len(string))

返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数

string.decode(encoding='UTF-8', errors='strict')

以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除非 errors 指 定 的 是 'ignore' 或 者'replace'

string.encode(encoding='UTF-8', errors='strict')

以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'

string.endswith(obj, beg=0, end=len(string))

检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.

string.expandtabs(tabsize=8)

把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。

string.find(str, beg=0, end=len(string))

检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1

string.format()

格式化字符串

string.index(str, beg=0, end=len(string))

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

string.isalnum()

如果 string 至少有一个字符并且所有字符都是字母或数字则返

回 True,否则返回 False

string.isalpha()

如果 string 至少有一个字符并且所有字符都是字母则返回 True,

否则返回 False

string.isdecimal()

如果 string 只包含十进制数字则返回 True 否则返回 False.

string.isdigit()

如果 string 只包含数字则返回 True 否则返回 False.

string.islower()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False

string.isnumeric()

如果 string 中只包含数字字符,则返回 True,否则返回 False

string.isspace()

如果 string 中只包含空格,则返回 True,否则返回 False.

string.istitle()

如果 string 是标题化的(见 title())则返回 True,否则返回 False

string.isupper()

如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

string.join(seq)

以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

string.ljust(width)

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

string.lower()

转换 string 中所有大写字符为小写.

string.lstrip()

截掉 string 左边的空格

string.maketrans(intab, outtab)

maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

max(str)

返回字符串 str 中最大的字母。

min(str)

返回字符串 str 中最小的字母。

string.partition(str)

有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.

string.replace(str1, str2,  num=string.count(str1))

把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.

string.rfind(str, beg=0,end=len(string) )

类似于 find() 函数,返回字符串最后一次出现的位置,如果没有匹配项则返回 -1。

string.rindex( str, beg=0,end=len(string))

类似于 index(),不过是返回最后一个匹配到的子字符串的索引号。

string.rjust(width)

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

string.rpartition(str)

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

string.rstrip()

删除 string 字符串末尾的空格.

string.split(str="", num=string.count(str))

以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+1 个子字符串

string.splitlines([keepends])

按照行('\r', '\r\n', '\n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。

string.startswith(obj, beg=0,end=len(string))

检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.

string.strip([obj])

在 string 上执行 lstrip()和 rstrip()

string.swapcase()

翻转 string 中的大小写

string.title()

返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())

string.translate(str, del="")

根据 str 给出的表(包含 256 个字符)转换 string 的字符,

要过滤掉的字符放到 del 参数中

string.upper()

转换 string 中的小写字母为大写

string.zfill(width)

返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0

string.capitalize():第一个字母大写
# 3.1 string.capitalize()
s = "my name is Lucky, I like basketball."
# 第一个字母大写 “My name is lucky, i like basketball.”
s1 = s.capitalize()
print(s1)
string.startswith(str): 字符串是否以str开头

判断字符串是否以某个子串开头

# 3.2 string.startswith(str): 字符串是否以str开头
print(s1.startswith("My"))
string.endswith(str): 字符串是否以str结尾

判断字符串是否以某个子串结尾。

# 3.3 string.endswith(str): 字符串是否以str结尾
print(s1.endswith("."))
len(string) 字符串长度

计算字符串的长度

# 3.4 len(string) 字符串长度
print(f"s1的长度是:{len(s1)}")

s1的长度是:36

string.find(str, startIndex = 0)字符串查找
# “My name is lucky, i like basketball.”
# 3.5 string.find(str) 查找子串
index = s1.find("lucky")
print(index)

输出结果:

11

未找到子串则返回-1

string.lower() 转换为小写

将字符串内容转换为小写

# 3.6 string.lower() 将字符串内容转换为小写
s = "That is a cat."
# 输出:that is a cat.
print(s.lower())
string.upper() 将字符串内容转换为大写
# 3.7 string.upper() 将字符串内容转换为大写
# 输出:THAT IS A CAT.
print(s.upper())
string.index(str) 子串的索引位置
s = "That is a cat."
# 输出:10
print(s.index("cat"))
# 未找到则发生报错,程序终止
print(s.index("dog"))
print("下一个测试")

找不到"dog",则发生报错

Traceback (most recent call last):
  File "/Users/zhouronghua/WORK/DEV/projects/Python/字符串.py", line 69, in <module>
    print(s.index("dog"))
          ~~~~~~~^^^^^^^
ValueError: substring not found
string.replace(old_str, new_str)字符串内容替换
# 3.9 string.replace(old_str, new_str)字符串内容替换
s2 = s.replace("cat", "monkey")
# 输出:That is a monkey.
print(s2)
string.swapcase() 翻转 string 中的大小写
# 3.10 string.swapcase() 翻转 string 中的大小写
# 输出:tHAT IS A MONKEY.
print(s2.swapcase())
string.strip() 去掉字符串前后的空白(\n,\r或者空格)
# 3.11 string.strip() 去掉字符串前后的空白(\n,\r或者空格)
s = "   I like Lucy.  "
print(s)
# 输出:I like Lucy.
print(s.strip())
string.split(str) 字符串切分为字符串数组
# 3.12 string.split(str) 字符串切分为字符串数组
s = "com_demo_java_nativeInit"
# 采用 _ 进行字符串切分, 输出:['com', 'demo', 'java', 'nativeInit']
print(s.split("_"))
string.join(集合) 字符串拼接
# 3.12 join 字符串拼接
list = ["orange", "banana", "apple"]
s = "_".join(list)
# 输出:orange_banana_apple
print(s)

2.7.9 列表(List)

序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。

Python有6个序列的内置类型,但最常见的是列表和元组。

Python已经内置确定序列的长度以及确定最大和最小的元素的方法。

列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。

列表的数据项不需要具有相同的类型

创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
2.7.9.1 列表的切分

根据索引范围对列表元素进行切分。

语法:

list[startIndex:endIndex:step]

和字符串切分类似。

list2 = [1, 2, 3, 4, 5, 6, 7 ]
# 1.列表元素的切分
print("list2[1:5]: ", list2[1:5])
# 从第一个开始的元素 输出:从第一个开始的元素 [2, 3, 4, 5, 6, 7]
print("从第一个开始的元素", list2[1:])
2.7.9.2 list.append(元素)末尾添加元素
# 2.list.append(元素) 列表末尾添加元素
list2.append(100)
print(list2)

输出:

[1, 2, 3, 4, 5, 6, 7, 100]

2.7.9.3 list.extend(列表)将列表合并追加到末尾
# 3.list.extend(列表)将列表合并追加到末尾
list2.extend(["苹果", "葡萄"])
# 输出:[1, 2, 3, 4, 5, 6, 7, 100, '苹果', '葡萄']
print(list2)
2.7.9.4 更新列表元素:采用索引更新列表元素
# 4.更新列表元素:采用索引更新列表元素
# list2的第二个元素更新为15
list2[1] = 15
# 输出:[1, 15, 3, 4, 5, 6, 7, 100, '苹果', '葡萄']
print(list2)
2.7.9.5 list.remove(元素)删除列表元素

list.remove(元素) 删除列表元素。

# 如果元素不存在则发生错误
list2.remove(15)
# 输出:[1, 3, 4, 5, 6, 7, 100, '苹果', '葡萄']
print(list2)

如果删除一个不存在的元素

# 删除一个不存在的元素报错
list2.remove(2)
print(list2)
Exception has occurred: ValueError
list.remove(x): x not in list
  File "/Users/zhouronghua/WORK/DEV/projects/Python/列表.py", line 31, in <module>
    list2.remove(2)
    ~~~~~~~~~~~~^^^
ValueError: list.remove(x): x not in list

在循环中删除元素

# 删除元素:删除第一个"李三丰"后,后面的元素往前移动一个位置,下一轮循环直接到”赵敏“
myList = ["赵本山", "李三丰", "李九龄", "赵敏"]
for item in myList:
    if item.startswith("李"):
        myList.remove(item)
# 输出结果:'赵本山', '李九龄', '赵敏']
print(myList)

发现"李九龄"仍然在列表中。

2.7.9.6 list.index(元素) 查找元素所在的索引位置

# 4.list.index(元素) 查找元素所在的索引位置

print(list2.index(5))

# [1, 3, 4, 5, 6, 7, 100, '苹果', '葡萄']
# 4.list.index(元素) 查找元素所在的索引位置
print(list2.index(5))
# 输出:3

如果元素不存在则会报错

# 如果元素不存在则报错
# Traceback (most recent call last):
#  File "/Users/zhouronghua/WORK/DEV/projects/Python/列表.py", line 36, in <module>
#    print(list2.index(8))
#          ~~~~~~~~~~~^^^
#ValueError: list.index(x): x not in list
print(list2.index(8))
2.7.9.7 Python列表脚本操作符

列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

如下所示:

Python 表达式 结果 描述
len([1, 2, 3]) 3 长度
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合
['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复
3 in [1, 2, 3] True 元素是否存在于列表中
for x in [1, 2, 3]: print x, 1 2 3 迭代
2.7.9.8 Python列表函数&方法

Python包含以下函数:

序号 函数
1 cmp(list1, list2)
比较两个列表的元素
2 len(list)
列表元素个数
3 max(list)
返回列表元素最大值
4 min(list)
返回列表元素最小值
5 list(seq)
将元组转换为列表

Python包含以下方法:

序号 方法
1 list.append(obj)
在列表末尾添加新的对象
2 list.count(obj)
统计某个元素在列表中出现的次数
3 list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4 list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5 list.insert(index, obj)
将对象插入列表
6 list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7 list.remove(obj)
移除列表中某个值的第一个匹配项
8 list.reverse()
反向列表中元素
9 list.sort(cmp=None, key=None, reverse=False)
对原列表进行排序
2.7.9.9 列表排序

列表升序排列list.sort()。如果需要降序,list.sort(reverse=True)

# 5.列表元素排序 list.sort()
list3 = [2,100, 40, 7, 27]
list3.sort()
# 输出:[2, 7, 27, 40, 100]
print(list3)
# 如果需要降序排列
list3.sort(reverse=True)
# 输出结果:[100, 40, 27, 7, 2]
print(list3)
2.7.9.10 列表翻转

将列表元素翻转

# [100, 40, 27, 7, 2]
# 6.列表翻转
list3.reverse()
# 输出结果:[2, 7, 27, 40, 100]
print(list3)

2.7.10 元组(Tuple)

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号,列表使用方括号。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"
2.7.10.1 只有一个元素的元组

元组中只包含一个元素时,需要在元素后面添加逗号

tup1 = (50,)

如果不加, 括号会被识别为优先级符号。

# 1.只有一个元素的元组
tup = (10)
# 如果不加逗号,括号被识别为优先级符号,因此 tup为<class 'int'>
print(type(tup))
# 元组中只包含一个元素时,需要在元素后面添加逗号
tup = (10, )
# 输出:<class 'tuple'>
print(type(tup))
2.7.10.2 访问元组

元组可以使用下标索引来访问元组中的值

tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print "tup1[0]: ", tup1[0]
print "tup2[1:5]: ", tup2[1:5]
# 2.访问元组元素
# 采用下标访问元组元素
print(tup[0])
# 元组支持切分
# 输出:(3, 4, 5)
print(tup2[2:])
2.7.10.3 元组不支持元素修改

元组是不可变的,因此不支持元素的修改。

如果元组的元素是数组,不能修改数组,但可以修改数组中的元素。

# 3.元组不支持元素修改
tup4 = (1,2,3, ["苹果", "香蕉", "橘子"])
# 可以修改数组元素的内容
tup4[3].append("葡萄")
# 输出:(1, 2, 3, ['苹果', '香蕉', '橘子', '葡萄'])
print(tup4)
2.7.10.4 删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

tup = ('physics', 'chemistry', 1997, 2000)
 
print tup
del tup
print "After deleting tup : "
print tup

以上实例元组被删除后,输出变量会有异常信息,输出如下所示:

('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    print tup
NameError: name 'tup' is not defined

删除元组以后,元组的引用不存在。因此会报错“name 'tup' is not defined”

2.7.10.5 元组运算符

与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式 结果 描述
len((1, 2, 3)) 3 计算元素个数
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 连接
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') 复制
3 in (1, 2, 3) True 元素是否存在
for x in (1, 2, 3): print x, 1 2 3 迭代
2.7.10.6 元组索引,截取

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

元组:

L = ('spam', 'Spam', 'SPAM!')
Python 表达式 结果 描述
L[2] 'SPAM!' 读取第三个元素
L[-2] 'Spam' 反向读取,读取倒数第二个元素
L[1:] ('Spam', 'SPAM!') 截取元素

2.7.10.7 元组内置函数

Python元组包含了以下内置函数

序号 方法及描述
1 cmp(tuple1, tuple2)
比较两个元组元素。
2 len(tuple)
计算元组元素个数。
3 max(tuple)
返回元组中元素最大值。
4 min(tuple)
返回元组中元素最小值。
5 tuple(seq)

2.7.11 Set集合(Set)

set是包含不重复元素的无序集合。

2.7.11.1 set的创建

创建一个空set

# 1.创建一个空集合
s = set()
# 输出<class 'set'>
print(type(s))

# 创建一个非空set
s = {1,2,6}
print(s)
# 输出:<class 'set'>
print(type(s))
2.7.11.2 set元素是可哈希的

不可哈希:python中的set集合存储元素的时候,需要对数据进行哈希计算,根据计算出来的哈希   值进行存储数据。

set集合要求存储的数据元素必须是可以进行哈希计算的。

可变的数据类型是不可哈希的,list, dict, set

可哈希不可变的数据类型。int, str, 元组,布尔值

# 列表是可变的,不可以作为set的元素

# 不可哈希:python中的set集合存储元素的时候,需要对数据进行哈希计算,根据计算出来的哈希值进行存储数据。
#         set集合要求存储的数据元素必须是可以进行哈希计算的。
#         可变的数据类型是不可哈希的,list, dict, set
# 可哈希:不可变的数据类型。int, str, 元组,布尔值
# 列表是可变的,不可以作为set的元素
s = {1,2,"哈巴狗", [2,6,7]}
print(s)

# 创建集合
s = {1,5, True, 6}
# True元素丢失。输出:{1, 5, 6}
print(s)
print(len(s))
# 为什么True丢失了呢?
# 1. 核心原因:True 等于 1在 Python 中,bool 是 int 的子类。
# 这意味着:True 的整数值为 1False 的整数值为 0表达式 True == 1 的结果为 True表达式 False == 0 的结果为 True
# 字符串元素
s.add("小龙女")
# 输出:{1, '小龙女', 5, 6}
print(s)
2.7.11.3 添加元素

set集合是无需的,添加的元素不一定在末尾;另外,Set集合元素是唯一的,如果已经存在,则添加后set维持不变。

# 3.set集合添加元素
s.add("欧阳锋")
s.add("欧阳锋")
# 输出:{1, 5, 6, '欧阳锋', '小龙女'}
print(s)
2.7.11.4 删除元素set.remove(e)

set集合通过remove(e:Elment)删除元素

# 4.删除元素
s.remove("欧阳锋")
# 输出:{1, 5, 6, '小龙女'}
print(s)
2.7.11.5 更新元素

set集合元素是不可变的,更新元素采用:删除旧元素+添加新元素的方式实现。

# 5.更新元素
# set集合元素是不可变的,更新元素采用:删除旧元素+添加新元素的方式实现。
# 把set集合的小龙女替换为“杨过”
s.remove("小龙女")
# 输出:{1, 5, 6, '杨过'}
s.add("杨过")
print(s)
2.7.11.6 集合的运算:交集、并集和差集

集合的运算:交集、并集和差集

# 6.2 交集
s1 = {"赵本山", "大脚", "小沈阳"}
s2 = {"张嘎", "贾队长", "小沈阳"}
print(s1 & s2)
# set.intersection(set) 计算集合的交集
print(s1.intersection(s2))

计算并集

# 6.2 并集
# 输出:{'贾队长', '大脚', '小沈阳', '张嘎', '赵本山'}
print(s1 | s2)
# 输出:{'贾队长', '大脚', '小沈阳', '张嘎', '赵本山'}
print(s1.union(s2))

计算差集

set1 - set2: s1减去在set2中出现的元素。

# 6.3 差集
# 输出:{'大脚', '赵本山'}
print(s1 - s2)
# 输出:{'大脚', '赵本山'}
print(s1.difference(s2))
2.7.11.7 取出重复元素

set的作用可以去除重复元素。利用set元素唯一的特性,可以去除列表的重复元素。得到去重后的无序集合。

去除重复元素
list = [1,1,3, 30, '贾队长', '大脚', '小沈阳', '张嘎', '赵本山', '贾队长', '大脚', '小沈阳', '张嘎', '赵本山']
# 输出:{1, 3, '贾队长', '张嘎', '小沈阳', '赵本山', '大脚', 30}
print(set(list))
# 得到去重后的无序列表

2.7.12 字典(Dictionary)

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

字典的每个键值 key:value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中.

语法:

d = {key1 : value1, key2 : value2 }

注意:dict 作为 Python 的关键字和内置函数,变量名不建议命名为 dict

键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。

字典,也可以称做MAP。

键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。

>>> tinydict = {'a': 1, 'b': 2, 'b': '3'}
>>> tinydict['b']
'3'
>>> tinydict
{'a': 1, 'b': '3'}
2.7.12.1 获取键对应的值

根据键获取存储的value值

# 2.根据键获取对应的值
# 输出:456
print(tinydict1['abc'])
print(tinydict1.get('abc'))
# 如果对应的键不存在的话
# 直接报错:Traceback (most recent call last):
#   File "/Users/zhouronghua/WORK/DEV/projects/Python/字典.py", line 18, in <module>
#    print(tinydict1['ccc'])
#          ~~~~~~~~~^^^^^^^
# KeyError: 'ccc'
# print(tinydict1['ccc'])
# get方式安全返回,不存在的键获取得到None
v = tinydict1.get('ccc')
# 输出:None
print(v)
# 输出:<class 'NoneType'>
print(type(v))
2.7.12.2 修改字典

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对

# 4. 修改字典
# 可以根据键修改对应的值,或者直接增加键值对
tinydict['Age'] = 8 # 更新
# 输出:{'Alice': '2341', 'Beth': '9102', 'Cecil': '3258', 'Age': 8}
print(tinydict)
# 输出:{'Alice': '2341', 'Beth': '9102', 'Cecil': '3258', 'Age': 8, 'School': 'RUNOOB'}
tinydict['School'] = "RUNOOB" # 添加
print(tinydict)
2.7.12.3 删除字典元素

能删单一的元素也能清空字典,清空只需一项操作。

显示删除一个字典用del命令,如下实例:

# 5.删除字典元素
# 根据key删除字典的键值对
del tinydict['Alice']
# 输出:{'Alice': '2341', 'Beth': '9102', 'Cecil': '3258', 'Age': 8, 'School': 'RUNOOB'}
{'Beth': '9102', 'Cecil': '3258', 'Age': 8, 'School': 'RUNOOB'}
print(tinydict)

# 删除整个字典
del tinydict          # 删除字典
# 字典输出以后访问元素则会发生 NameError
# NameError: name 'tinydict' is not defined. Did you mean: 'tinydict1'?
print(tinydict['Beth'])
2.7.12.4 字典键的特性

字典值可以没有限制地取任何 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。

两个重要的点需要记住:

1)键是唯一的:不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:

# 字典值可以没有限制地取任何 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。
# 两个重要的点需要记住:
# 1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
tinydict = {'Name': 'Runoob', 'Age': 7, 'Name': 'Manni'} 
#. 输出:tinydict['Name']:  Manni
print("tinydict['Name']: ", tinydict['Name'])

2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行

# 2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行,如下实例:
# TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
tinydict = {['Name']: 'Zara', 'Age': 7} 

2.7.12.5 字典内置函数&方法

Python字典包含了以下内置函数:

序号 函数及描述
1 cmp(dict1, dict2)
比较两个字典元素。
2 len(dict)
计算字典元素个数,即键的总数。
3 str(dict)
输出字典可打印的字符串表示。
4 type(variable)
返回输入的变量类型,如果变量是字典就返回字典类型。

Python字典包含了以下内置方法:

序号 函数及描述
1 dict.clear()
删除字典内所有元素
2 dict.copy()
返回一个字典的浅复制
3 dict.fromkeys(seq[, val])
创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
4 dict.get(key, default=None)
返回指定键的值,如果值不在字典中返回default值
5 dict.has_key(key)
如果键在字典dict里返回true,否则返回false。Python3 不支持。
6 dict.items()
以列表返回可遍历的(键, 值) 元组数组
7 dict.keys()
以列表返回一个字典所有的键
8 dict.setdefault(key, default=None)
和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9 dict.update(dict2)
把字典dict2的键/值对更新到dict里
10 dict.values()
以列表返回字典中的所有值
11 pop(key[,default])
删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
12 popitem()
返回并删除字典中的最后一对键和值。
2.7.12.6 字典嵌套

字典可以嵌套使用。value的值可以是一个字典。

# 6.字典的嵌套
nestdic = {
    "friuts": {
        "banana" : "黄色",
        "apple": "红色",
        "orange": "橘色"
    },
    "annimal": {
        "cat": "田园猫",
        "dog": "柯基",
        "chicken": "黄毛鸭"
    },
    "children" : [
        {"name":"小布丁", "age": 8},
        {"name":"靓仔", "age": 5}
    ]
}
# 打印friuts二级元素banana的值
# 输出:黄色
print(nestdic["friuts"]["banana"])
# 打印children第二个元素的name
# 输出:靓仔
print(nestdic["children"][1]["name"])
# 修改children第二个元素的age
nestdic["children"][1]["age"] = 4
# 输出:{'name': '靓仔', 'age': 4}
print(nestdic["children"][1])

2.8 字符集编码与解码

编码主要解决电脑如何存储文字信息。

ASCII码:128个基本字符;

中文编码:gb2312, gbk

日文编码:JIS编码

Unicode: 全球统一编码,万国码。UTF-16:4个字节表示一个字符。UCS-4

UTF:是可变长的Unicode, 可以进行数据的传输和存储。

UTF-8:最短的字节长度8;

        英文:8bit 1byte

        欧洲文字: 16bit (2byte)

        中文:24bit (3byte)

UTF-16: 最短的字节长度16;

gbk和utf-8不能直接转化

bytes

程序员平时遇见的所有数据最终单位都是字节byte。

1.编码 str.encode(编码格式)

2.解码:bytes.decode(编码格式)
# 1.编码 str.encode(编码格式)
a = "你好!Python"
# print(len(a))
bs = a.encode("utf-8")
# 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81Python'
print(bs)
# 输出:15
print(len(bs))
b = bs.decode("utf-8")
# 解码以后能够恢复到原来的字符
# 输出:你好!Python
print(b)
# 输出:True
print(len(b) == len(a))

2.9 运算符

Python语言支持以下类型的运算符:

2.9.1 算术运算符

运算符 描述 实例
+ 加 - 两个对象相加 a + b 输出结果 30
- 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ 除 - x除以y b / a 输出结果 2
% 取模 - 返回除法的余数 b % a 输出结果 0
** 幂 - 返回x的y次幂 a**b 为10的20次方, 输出结果 100000000000000000000
// 取整除 - 返回商的整数部分(向下取整
>>> 9//2
4
>>> -9//2
-5
# 1.数值运算符 +-*/ %
a = 10
b = 3
print(a+b)
# 计算 a / b
# 输出: 3
print(a // b)
# 3.33333333
print(a/b)

2.9.2 比较运算符

运算符 描述 实例
== 等于 - 比较对象是否相等 (a == b) 返回 False。
!= 不等于 - 比较两个对象是否不相等 (a != b) 返回 True。
> 大于 - 返回x是否大于y (a > b) 返回 False。
< 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量 True 和 False 等价。 (a < b) 返回 True。
>= 大于等于 - 返回x是否大于等于y。 (a >= b) 返回 False。
<= 小于等于 - 返回x是否小于等于y。

# 2.比较运算符
# > < >= <= != ==
# 模拟用户登录
name = input("请输入姓名:")
passwd = input("请输入密码:")
# 输出:
# 请输入姓名:Kimy
# 请输入密码:123456
# 用户名或者密码错误
if (name == "Lucky" and passwd == "123456"):
    print("用户登录成功")
else:
    print("用户名或者密码错误")

2.9.3 赋值运算符

运算符 描述 实例
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 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
# 3.赋值运算符
# = += -= *= ...

# 计算1+2+。。。+100
n = 1
sum = 0
while n <= 100:
    sum += n
    n += 1
print(sum)

2.9.4 位运算符

按位运算符是把数字看作二进制来进行计算的。

运算符 描述 实例
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:将二进制表示中的每一位取反,0 变为 1,1 变为 0。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011 (以补码形式表示),在一个有符号二进制数的补码形式。
<< 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
# 4.位运算符
a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0
 
c = a & b;        # 12 = 0000 1100
print ("1 - c 的值为:", c)
 
c = a | b;        # 61 = 0011 1101 
print ( "2 - c 的值为:", c)
 
c = a ^ b;        # 49 = 0011 0001
print ("3 - c 的值为:", c)
 
c = ~a;           # -61 = 1100 0011
print("4 - c 的值为:", c) 
 
c = a << 2;       # 240 = 1111 0000
print( "5 - c 的值为:", c)
 
c = a >> 2;       # 15 = 0000 1111
print("6 - c 的值为:", c) 

2.9.5 逻辑运算符

Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

运算符 逻辑表达式 描述 实例
and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。
or x or y 布尔"或" - 如果 x 是非 0,它返回 x 的计算值,否则它返回 y 的计算值。 (a or b) 返回 10。
not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False
# 5.逻辑运算符
#    1)and 并且,左右两端同时成为,结果才能成立
#    2)or 或者 左右两端有成为,结果就成立
#    3)not 非  非真即假,非假即真
#   当 and 和 or 以及 not同时出现的时候,最好加上括号。不会产生歧义或者不容易理解的问题。
#   如果没有括号怎么办?
#   记住运算顺序:
#       先算括号 > 再算 not > and > or
# 输出:Flase
print(True and False and True)
# 输出:True
print(not True)
# 输出:True
print(True and not False or False and not False)

2.9.6 成员运算符

除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

运算符 描述 实例
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

a = 10
b = 20
list = [1, 2, 3, 4, 5 ];

# 输出:1 - 变量 a 不在给定的列表中 list 中
if ( a in list ):
   print("1 - 变量 a 在给定的列表中 list 中")
else:
   print("1 - 变量 a 不在给定的列表中 list 中")
 
# 输出:2 - 变量 b 不在给定的列表中 list 中
if ( b not in list ):
   print("2 - 变量 b 不在给定的列表中 list 中")
else:
   print("2 - 变量 b 在给定的列表中 list 中")

# 插入元素a
list.append(a)
# 输出:1 - 变量 a 在给定的列表中 list 中
if ( a in list ):
   print("1 - 变量 a 在给定的列表中 list 中")
else:
   print("1 - 变量 a 不在给定的列表中 list 中")

2.9.7 身份运算符

身份运算符用于比较两个对象的存储单元

运算符 描述 实例
is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

注: id() 函数用于获取对象内存地址。

# 7.身份运算符
#       is 是判断两个标识符是不是引用自一个对象
#       not is 是判断两个标识符不是引用自一个对象
a = 20
b = 20
# 输出:1 - a 和 b 有相同的标识
if ( a is b ):
   print( "1 - a 和 b 有相同的标识")
else:
   print("1 - a 和 b 没有相同的标识")

# 输出:2 - a 和 b 有相同的标识
if ( a is not b ):
   print("2 - a 和 b 没有相同的标识")
else:
   print("2 - a 和 b 有相同的标识")
 
# 修改变量 b 的值
b = 30
# 输出:3 - a 和 b 没有相同的标识
if ( a is b ):
   print("3 - a 和 b 有相同的标识")
else:
   print("3 - a 和 b 没有相同的标识")

# 输出:4 - a 和 b 没有相同的标识
if ( a is not b ):
   print("4 - a 和 b 没有相同的标识")
else:
   print("4 - a 和 b 有相同的标识")

2.9.8 运算符优先级

以下表格列出了从最高到最低优先级的所有运算符:

运算符 描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 'AND'
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符
# 结果:4
print( 4 - 2 << 1)
# 相当于:(4 -2) << (1+2) = 2 << 3 = 16
print( 4 - 2 << 1 + 2)
# [(~3) + 4 - 2] << (2 + 2) = [-4 + 4 -2] << 4 = (-2) << 4 = -32
print(~3 + 4 - 2 << 2+2)
# 输出:-4
print(~3)

2.10 文件操作

2.10.1 打开文件

你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。

语法:

file object = open(file_name [, access_mode][, buffering])

各个参数的细节如下:

  • file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。可以使用绝对路径,也可以使用相对路径。
  • access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)
  • encoding:编码格式。

不同模式打开文件的完全列表:

模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

文件读写模式
模式 r r+ w w+ a a+
+ + + +
+ + + + +
创建 + + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +
File对象的属性

一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。

以下是和file对象相关的所有属性的列表:

属性 描述
file.closed 返回true如果文件已被关闭,否则返回false。
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。

2.10.2 写入文件

语法:

file.write(内容)
# 文件操作
# 1.打开文件
#   文件路径:
#         绝对路径: "c:/test/xxx.txt"
#   相对路径:
#         “xxx.txt”
f = open("最爱水果.txt", mode="w", encoding="utf-8")
# 2.写入文本内容
# 将列表内容写入分行文件,
list = ["苹果", "葡萄", "枸杞", "山楂", "橘子"]
for line in list:
    f.write(line)
    f.write("\n")

# 关闭文件
f.close()

2.10.3 关闭文件

File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

语法:

file.close()

2.10.4 文件读取read()方法

read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

语法:

# 文件内容读取
fileObject.read([count])
# 按行读取
str = fileObject.readLine()
# 读取所有行
str = fileObject.readLines()

在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。

# 2.读取文件内容
f2 = open("最爱水果.txt", mode="r", encoding="utf-8")
while True:
    line = f2.readline()
    print(line)
    if len(line) == 0:
        break

# 读取全部内容
f2.seek(0)
# 输出:['苹果\n', '葡萄\n', '枸杞\n', '山楂\n', '橘子\n']
print(f2.readlines())
f2.close()

2.10.5  文件定位

tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。

seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。

如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。

例子:

# 打开一个文件
fo = open("foo.txt", "r+")
str = fo.read(10)
print "读取的字符串是 : ", str
 
# 查找当前位置
position = fo.tell()
print "当前文件位置 : ", position
 
# 把指针再次重新定位到文件开头
position = fo.seek(0, 0)
str = fo.read(10)
print "重新读取字符串 : ", str
# 关闭打开的文件
fo.close()

2.10.6 with操作文件

with使用上下文操作文件,不需要对文件对象执行close,退出上下文文件自动关闭。

# 3.通过with操作文件对象
with open("最爱水果.txt", mode="r", encoding="utf-8") as f4:
    for line in f4:
        print(line)
# 退出with上下文区域f4已经关闭。
# 输出:True
print(f4.closed)

2.10.7 重命名和删除文件

Python的os模块提供了帮你执行文件处理操作的方法,比如重命名和删除文件。

要使用这个模块,你必须先导入它,然后才可以调用相关的各种功能。

rename() 方法

rename() 方法需要两个参数,当前的文件名和新文件名。

语法:

os.rename(current_file_name, new_file_name)
import os
 
# 重命名文件test1.txt到test2.txt。
os.rename( "test1.txt", "test2.txt" )
remove()方法

你可以用remove()方法删除文件,需要提供要删除的文件名作为参数。

语法:

os.remove(file_name)

2.10.8 目录操作

所有文件都包含在各个不同的目录下,不过Python也能轻松处理。os模块有许多方法能帮你创建,删除和更改目录。

创建目录mkdir()方法

可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。

语法:

os.mkdir("newdir")
import os
 
# 创建目录test
os.mkdir("test")
# 4 目录操作
# 创建一个新目录test, 如果目录已经存在则报错
# FileExistsError: [Errno 17] File exists: 'test'
# 通过os.path.exists("test")先判断文件夹是否存在,不存在则创建
if os.path.exists("test") == False:
    os.mkdir("test", mode=0o777)
chdir()方法

可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。

import os
 
# 将当前目录改为"/home/newdir"
os.chdir("/home/newdir")
getcwd() 方法

getcwd()方法显示当前的工作目录。

# 显示当前目录
# 输出:/Users/xxx/WORK/DEV/projects/Python
print(os.getcwd())
rmdir()方法

rmdir()方法删除目录,目录名称以参数传递。

在删除这个目录之前,它的所有内容应该先被清除。

语法:

os.rmdir('dirname')
文件、目录相关的方法

File 对象和 OS 对象提供了很多文件与目录的操作方法,可以通过点击下面链接查看详情:

参考文献:

https://www.bilibili.com/video/BV1tk6jBFEsD?spm_id_from=333.788.player.switch&vd_source=588d631cf0dd8fa52573829827fe8788&p=5

https://www.runoob.com/python/python-strings.html

更多推荐