Python语言特点
面向对象
在很多教材中,开篇对 Python 的定义就是,“Python 可以被定义为一种面向对象的脚本编程语言”。没错,这算是 Python 语言最大的一个特点。
面向对象和面向过程的区别
面向对象简单来说就是以对象展开,输入的一切都是“对象”。面向对象就好像是一部纪传体,人物(对象)可以穿梭在不同的时期(程序)。这就需要先分析需求,分解问题,再把对象分别写好,需要的时候调用即可。 面向过程简单来说就是需要走程序。面向过程就好像是一部编年体,没错,在这里你可以看到详细的每一年人物(程序)是怎么生活(运行)的。这就需要在分析需求的同时列出所以需要的步骤,依次运行程序,一步一步地实现需求。
可移植性
:Python 可以移植到许多平台上,这样就可以实现在不同平台上的工作,这些平台包括 Linux、Windows、Windows CE、以及 Google 基于 linux 开发的 android 平台等等。
丰富的库
Python 本身也会提供很多标准库来辅助用户进行各类程序开发,同时也支持第三方库的安装,Python 强大的库可以满足数据分析、游戏开发、密码系统等多种需求。
支持中文
如果你是初次接触编程,那么支持中文开发的 Python 语言一定能让你更快上手。
使用开源
Python 同时也是一个自由、开放的源码软件,开源软件的源代码任何人都可以审查、修改和增强,或者把它的一部分用于新的自由软件中。
语法简洁
Python 的语法简洁主要体现在它更接近自然语言,读起来简洁易懂,同时,在同样的程序中 Python 所需的代码量更少,更少的代码行数、更简洁的表达方式可减少程 序错误以及缩短开发周期。
程序的格式框架
缩进
缩进指每行语句开始前的空白区域,用来表示 Python 间的包含和层次关系。 一般代码不需要缩进,顶行编写且不留空白。当表示分支、循环、函数、类等程序含义时,在 if、while、for、def、class 等关键字所在完整语句后通过英文冒号(:)结尾并在之后 进行缩进,表明后续代码与紧邻无缩进语句的所属关系。 代码编写中,缩进可以用【Tab】键实现,也可以用多个空格(一般是 4 个)实现,但两者不可混用。如下图,框起来的地方就是缩进。
sum = 0
for i in range (0,10,2):
sum += i
print(sum)
注释
注释是代码中的辅助性文字,一般用于程序员对代码的说明。Python 程序中的非注释语句将按顺序执行,注释语句将被解释器过滤掉,不被执行。 Python 采用(#)表示一行注释的开始,文档注释是三个单引号(‘’')或三个双引号(“”")。
# 单行注释
'''三个单引号'''
"""三个双引号"""
续行符
Python 程序是逐行编写的,每行代码长度无长度限制。但有的时候一句话过长,放在一行会造成阅读困难,那么我们可以使用续行符解决这个问题。 续行符由反斜杠(\)符号表达。
print("死死死死死死死死死死死死死死\
思思思思思思思思思思死死死死死\
死死死死死死死死死死死\
死死死死死死死死死四\
三四三死死死死死死")
续行符后不能存在空格,续行符后必须直接换行。 续行符不仅可以用于单行代码较长的情况,也适合对代码进行多行排版增加可读性的情况。
基本语句
基本输入输出
input():输入函数
使用方式:<变量> = input(<提示性文字>)
a = input("请输入一个数字")
# tpye() 用来校验数据类型
print("这个数字是{},input会让输进去的数字转化为字符串类型,如{}".format(a,type(a)))
eval()
使用方式:<变量> = eval(<字符串>) 去掉字符串最外侧的引号,并按照 Python 语句方式执行去掉引号后的字符内容,通常会和 input 函数一起使用。 eval() 函数用来执行一个字符串表达式,并返回表达式的值。 字符串表达式可以包含变量、函数调用、运算符和其他 Python 语法元素。
eval(expression[, globals[, locals]])
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
eval() 函数将字符串 expression 解析为 Python 表达式,并在指定的命名空间中执行它。
返回值
eval() 函数将字符串转换为相应的对象,并返回表达式的结果。
x = 7
print(eval('5 * x'))
print(eval('pow(2,6)'))
print(eval('2+9'))
n = 10
result = eval('n + 888')
print(result)
print("如何一个是数字,一个是字符串,那么会打印数字长度的字符串值,如下")
print("需要注意的是,运算方法为乘法时会造成这样的结果,其他则会报错")
namespace = {'c':6,"d":'5'}
result = eval("c * d",namespace)
print("会打印6个"+ result)
print("如果都是数字,执行计算函数则不受影响")
namespace = {'c':6,"d":5}
result = eval("c + d",namespace)
print(result)
eval函数的其他有用小知识
eval 方法能使字符串本身的引号去掉,保留字符的原本属性。
a = '55555'
print(type(a))
b = eval(a)
print(type(b))
print('-----------')
str = "[{11,22},{22,33},{33,44},{44,55}]"
print(type(str))
list = eval(str)
print(type(list))
eval() 函数也可以直接用来提取用户输入的多个值。
a,b=eval(input("用户输入的两个值,用,隔开"))
print("用户输入的值分别是{}和{}".format(a,b))
eval() 函数可将看起来像列表的字符串重新转换为列表。
zifu=" ['1709020230', '1707030416', '0', '0', '0'] "
print(type(zifu))
ls =eval(zifu)
print(type(ls))
eval 函数有将字符格式的伪 python 代码转成正常的 python 代码,特别适合于读取 config 文件和获取用户输入格式的转换
print():输出函数
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects -- 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
sep -- 用来间隔多个对象,默认值是一个空格。
end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
file -- 要写入的文件对象。
flush -- 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。
print(1)
a = 1
b = 2
print(a,b)
print('我真的','哭死了','这个python','好像不难',sep="-")
import time
# end="" 使得打印的时候不换号
print("loading",end="")
for i in range(20):
# 这个也是同理
print('.',end="",flush=True)
time.sleep(0.5)
a = "柳如烟"
b = "沈幼楚"
print("{}有什么好的,娶我{}委屈你了?".format(a,b))
分支语句
分支语句是控制程序运行的一种语句,它的作用是根据判断条件选择程序执行路径。分支语句包括单分支、二分支和多分支。
单分支语句
a = 50
if a < 100:
print("a小于100")
二分支语句
a,b = eval(input("请输入两个数字并用,隔开"))
if a > b:
print("{}大于{}".format(a,b))
else:
print("{}大于{}".format(b,a))
多分支语句
a,b = eval(input("请输入两个数字并用,隔开"))
if a > b:
print("{}大于{}".format(a,b))
elif a < b:
print("{}小于{}".format(a,b))
else:
print("{}等于{}".format(a,b))
循环语句
循环语句是控制程序的一类重要语句,它的作用是根据判断条件确定一段程序是否再次执行 一次或者多次。循环包括:条件循环和遍历循环。
条件循环语句
while (<条件>):
<语句块 1>
<语句块 2>
当条件为 True 时,执行语句块 1,然后再次判断条件,当条件为 False 时,退出循环,执 行语句块 2。 eg
i = 1
while i:
j = 1
while j:
print (i, "*", j, " = ", i * j, ' '),
if i == j:
break
j += 1
if j >= 10:
break
print ("\n")
i += 1
if i >= 10:
break
遍历循环语句
使用方式: for <循环变量> in <遍历结构>:
<语句块>
从遍历结构中逐一提取元素,放在循环变量中,对于每个提取的元素执行一次语句块。
s = '123456789'
for i,j in enumerate(range(0,len(s),2)):
print (i,"=======",s[j])
list = [1,5,62,85,221,42,63,14,95,57]
list1 = list.pop()
print(list1)
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 语法
enumerate(sequence, [start=0])
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置的值。
基本语法元素
引用
Python 适用于各个领域,其最大的魅力就在于它可以使用大量的外部函数库。
import 语句
import <库名 1>
import <库名 2>
... ...
import <库名 n>
from 方式
将模块中指定的属性或名称导入当前程序命名空间。 语法
from <库名> import <函数名>
同时,Python 也支持为功能库起别名。 import <功能库名> as 别名
import和from的区别
采用 import 方式,用户自定义的函数名字可以和库中函数的名字一样; 采用 from 方式,用户程序中不能用函数库中的名字定义函数。
命名规则
标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名。标识符是由一串字符串组成,这个字符串可以是任意字母、数字、下划线或汉字,但是不能以数字开头。 标识符也不能与关键字重名
变量
在标识符中,在运行过程中可以被修改的量被称为变量。
表达式 : 产生或计算新数据值的代码片段称为表达式,一般由数据和操作符等构成。
赋值语句 :对变量进行赋值的一行代码被称为赋值语句。
语法格式: <变量> = <表达式>
Python允许你同时为多个变量赋值。例如:
a = b = c = 1
# a,b,c 都为1
a, b, c = 1, 2, "john"
# a=1,b=2,c=john
常量
一旦赋值就不能改变值的标识符,Python 中无法定义常量。
基本数据类型
Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典)
数字类型
表示数字或数值的数据类型称为数字类型。 Python 提供 3 种数字类型:整数、浮点数和复数。
整数类型
整数类型概念与数学中整数的概念一致,理论上的取值范围是[-∞,+∞]。实际上 Python 支持任意大的数字,只受计算机内存大小限制。 整数类型有 4 种进制表示:十进制、二进制、八进制和十六进制
# 数字之间的进制转换
x = 100
print(bin(x)) # 将 x 转换为二进制整数
print(oct(x)) # 将 x 转换为八进制整数
print(int(x)) # 将 x 转换为十进制整数
print(hex(x)) # 将 x 转换为十六进制整数
# 不同数据类型之间可以相互转化
print(type(int(x))) # 将 x 转换为整数类型
print(type(float(x))) # 将 x 转换为浮点数类型
print(type(str(x))) # 将 x 转换为字符串类型
浮点数类型
浮点数类型与数学中实数的概念一致,表示带有小数的数值。Python 语言中要求浮点数类型必须带有小数部分,小数部分可以是 0。有两种表示方法:一般表示法和科学计数法。
pow(x,n)=x的n次方
# 一般表示法
print( pow(1010,25) )
# 科学计数法
print(pow(1010.0,25))
存在不确定尾数问题 受限于计算机表示浮点数使用的存储宽度,计算的二进制数并不是 0.1 和 0.2 而是计算机内 部最接近 0.1 和 0.2 的二进制数。求得的数反映到十进制表示上,就会产生一个不确定尾数,至于尾数是多少,计算机内部会根据二进制运算确定产生。
print(0.1+0.2)
# 浮点数大都是一个近似的值,为解决不确定尾数问题,我们可以使用 round()函数保留几位小数
# round(x,n):对数值 x 保留 n 位
print(round(0.1+0.2,1))
复数类型
class complex([real[, imag]])
real -- int, long, float或字符串;
imag -- int, long, float;
返回值
返回一个复数
print(complex(5,1))
需要注意的是 (5+1j) 加号中间不能留空格,不然会报错
数字类型的运算
数值运算操作符
x + y x - y x * y x / y x // y x % y x ** y -x +x
基本规则
整数之间运算,产生结果类型与操作符相关; 整数和浮点数混合运算,输出结果浮点数; 整数或浮点数与复数运算,输出结果是复数。
数值运算符
abs(x) divmod(x,y) pow(x,y)或pow(x,y,z) round(x)或round(x,d) max(x1,x2,…,xn) min(x1,x2,…,xn)
其他操作符
对象/常量 “” “python” 0 >=1 <=1 []空列表 ()空元组 {}空字典 None
操作符 操作含义 & 按位与 | 按位或 ~ 按位取反 ^ 按位异或 << 左移 >> 带符号右移
按位与(&):都是 1,才取 1,否则为 0。 按位或(|):存在 1,就取 1,均不为 1,即为 0。 按位取反(~):每个位上都取相反值,1 变成 0,0 变成 1。 按位异或(^):存在两个二进制数,当相应位上的数字不相同时,才取 1,若相同,即为 0。 左移(<<n):将一个数各二进制位全部向左移动若干位。(就相当于在右边加 n 个 0) 右移(>>n):将一个数各二进制位全部向右移动若干位。(就相当于在左边加 n 个 0)
十进制如何转二进制
将一个十进制正整数转换为二进制数的时候,只需要通过除 2 取余的方法即可;将一个十进制负整数转换为二进制数需要以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加 1。
字符串类型
计算机程序经常用于处理文本信息,文本信息在程序中使用字符串类型表示。字符串是字符的序列,用一对双引号(“”)或者一对单引号(‘’)括起来。 字符串属于不可变有序序列,包括两种序列体系:正向递增和反向递减。
判断是否为字符串及编解码
判断一个变量是否为字符串,可以使用内置函数 type()或 isinstance()。 内置函数中有type和inistance方法,故不做演示。 Python 除了支持 Unicode 编码的字符串类型(str)还支持字节串类型(bytes)。 字符串类型可以通过 encode()方法使之编码成为字节串类型,而字节串类型则可以通过 decode()方法使之解码成为字符串类型。
x = "写一个编解码来做测试"
x = x.encode()
print(x) # 这个是编码
x = x.decode()
print(x) # 这个是解码
转义字符
转义字符 \b \f \n \r \t \v \\ \’ \" \ooo \xhh \uhhhh
内置函数
range()
range(start, stop[, step])
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
校验数据类型
type()
type() 函数如果你只有第一个参数则返回对象的类型,三个参数返回新的类型对象。 语法:
type(object)
type(name, bases, dict)
name -- 类的名称。
bases -- 基类的元组。
dict -- 字典,类内定义的命名空间变量。
# 一个参数实例
print(type(1))
print(type('runoob'))
print(type([2]))
print(type({0:'zero'}))
x = 1
print(type( x ) == int) # 判断类型是否相等
isinstance()
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。 语法
isinstance(object, classinfo)
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
a = 2
print(isinstance (a,int))
print(isinstance (a,str))
print(isinstance (a,(str,int,list))) # 是元组中的一个返回 True
type()和isinstance()的区别
type() 不会认为子类是一种父类类型,不考虑继承关系。 isinstance() 会认为子类是一种父类类型,考虑继承关系。 如果要判断两个类型是否相同推荐使用 isinstance()。 返回值 type() 返回对象的类型对象,例如 <class ‘int’>。 isinstance() 返回布尔值,表示对象是否是指定类型或类型元组中任意类型的实例。 使用场景 type() 主要用于获取对象的类型,以及在动态创建类时使用。 isinstance() 主要用于判断对象是否是指定类型,特别适用于检查对象是否属于某一类或其子类。 继承关系 type() 不考虑继承关系,仅比较确切的类型。 isinstance() 考虑继承关系,如果对象是指定类型或其子类的实例,返回 True。