变量和简单的数据类型
在python中,定义变量时不需指定变量类型,运行时,解释器会根据右侧数据自动推出变量中的数据类型。
数据类型
数字类型:int,float,bool,complex(复数型)
非数字类型:字符串,列表,元组,字典
type(变量名):可查看其类型
bool型在计算时True=1,False=0
注释
单行注释:#
多行注释:’’’ ‘’'或""" “”"
字符串
input():实现键盘输入(任何内容python都认为是字符串,括号里写提示内容)
在python中用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。
“ * ”运算符可以连续拼接字符串
使用方法修改字符串:
str():将非字符串值表示为字符串 在python里如果字符串和数字做加法运算,会直接报错
title():以首字母大写的方式显示每个单词
upper():将字符串改为全部大写
lower():将字符串改为全部小写
rstrip():将字符串末尾空白删除,但这种删除只是暂时的,想要永久删除这个字符串的空白,必须将删除操作的结果保存到变量中
lstrip():剔除字符串开头的空白
strip():同时剔除字符串两端的空白
print函数输出内容后会自动换行,使用end可以替换换行
print("*",end="---")
%.nf:控制小数点后n位
a=1.2345234
print("%.2f"%a)
# 1.23
%0nd:控制输出位数; <n,则补齐0;>=n,则原样输出
a=12345
print("%06d"%a)
# 012345
以0b开头的数字是二进制,以0o开头的数字是八进制,以0x开头 的数字是十六进制
bin()内置函数可将数字转换为二进制
oct()将数字转换为八进制
hex()将数字转换为十六进制
int(‘12’,8)将字符串以八进制转换为整数
列表
在python中,用[]来表示列表,并用逗号分隔其中的元素
bicycle=['trek','redline']
print(bicycle)
#['trek','redline']
访问列表元素
print(bicycle[0]) #第一个列表元素的索引为0,当索引值为-1时,返回最后一个列表元素,但是当列表为空是,这样访问会导致错误
#trek
注意:当请求列表元素时,python只返回该元素,不包括方括号和引号
修改列表元素
bicycle[0]='bike'
操作列表的一些方法
index(value):取索引
append(value):在列表末尾添加元素
insert(index,value):在列表指定位置插入元素
extend(list):把另一个列表的完整内容追加到当前内容
pop():删除列表末尾的元素
pop(index):删除列表中指定索引的元素
remove(value):删除指定值的元素
del bicycle[0]
注意:使用del语句删除元素,本质上是将一个变量从内存中删除,后续的代码就不能再使用这个变量了
clear():清空列表
sort():对列表进行永久性排序,默认按字母顺序升序排列;若想要按与字母顺序相反的方向排序,只需向sort()方法中传递参数reverse=True
reverse():翻转列表
函数:
sorted():对列表进行临时排序,默认按字母顺序升序排列;若想要按与字母顺序相反的方向排序,只需向sort()方法中传递参数reverse=True
len():获取列表的长度
count():统计列表中某一数据出现的次数
min():
max():
sum():
range():生成一系列数字
list(元组):将元组转换为列表
tuple(列表):将列表转换为元组
range(1,5) #[1,5)
还可指定步长
range(1,5,2)
列表解析
将for循环和创建新元素的代码合并成一行,并自动附加新元素
squares=[value**2 for value in range(1,11)] #指定一个左方括号,并定义一个表达式用于生成你要存储到列表中的新值,在编写一个for循环,用于给表达式提供值,再加上右方括号。
#上面与下面的等价
squares=[]
for value in range(1,11):
square=value**2
squares.append(square)
切片:
players=['charles','martina']
print(players[0:1])
#['charles']
注意:如果没有指定第一个索引值,python将自动从列表开头开始;
如果没有指定第二个索引值,python将让切片终于列表末尾
元组
dimensions=(1,2)
#dimensions[0]=25错误,元组不可修改值
dimensions=(2,7) #但可给存储元组的变量赋值
注意:元组中只包含一个元素时,需在元素后添加逗号,否则其类型不为元组类型
for … in …:
else:
当for循环全部完成后,else会执行,若是break退出的循环else不会执行
字典
字典是一个无序的对象集合,使用print函数输出字典时,通常和定义的顺序不一致。
通过键值对存储数据,键必须唯一
访问字典中的值:
alien_0={'color':'green'}
print(alien_0['color'])
#green
alien_0['color']=red #如果key不存在,则新增键值对;如果key存在,则修改键值对
注意:键值对的排列顺序和添加顺序不同
方法:
update(dict):合并字典(如果被合并的字典中包含已经存在的键值对,会覆盖原有的键值对)
items():返回一个键值对列表
keys():返回字典中的所有键
values():返回字典中的所有值
函数:
set():可以让python找出列表中独一无二的元素
列表,元组,字符串都能比较大小,字典不能
列表,元组,字符串都能切片,字典不能
数字,字符串,元组:不可变类型(内存中的数据不允许被修改)
列表,字典:可变类型
函数
函数调用不能在定义的 上方
局部变量是在函数内部定义的变量,只能在函数内部使用
全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量
局部变量在函数执行时才会被创建,函数执行后局部变量被系统回收
在python中不允许直接修改全局变量的值,如果使用赋值语句,会在函数内部定义一个局部变量,并不会对全局变量进行什么变化
如果希望对全局变量进行修改,在函数内部使用global声明一下变量
为了保证所有函数都能正确使用到全局变量,应该将全局变量定义在函数上方
函数传递参数时,返回参数时都是返回的数据的引用,而不是数据本身
使用方法对列表,字典值进行修改时,不改变其内存地址,但使用赋值语句会修改变量的引用
变量的引用
a=1
id(a)
#140715592636064
b=a
id(b)
#140715592636064
a=2
id(a)
#140715592636096
id(b)
#140715592636064
只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用
如果传递的参数是可变类型,并且在函数内部使用方法修改了数据的内容,同样会影响外部的数据
def demo(num_list):
print("函数内部的代码")
num_list.append(6)
print(num_list)
print("函数执行完成")
gl_list=[1,2,3]
demo(gl_list)
#函数内部的代码
#[1, 2, 3, 6]
#函数执行完成
print(gl_list)
#[1, 2, 3, 6]
def demo(num_list):
print("函数内部的代码")
num_list=[1,4,5]
#num_list+=num_list 列表变量使用+不会做相加再赋值的操作,本质上是在调用列表的extend方法,不会修改变量的引用,因此会影响外部的数据
print(num_list)
print("函数执行完成")
gl_list=[4,7]
demo(gl_list)
#函数内部的代码
#[1, 4, 5]
#函数执行完成
print(gl_list)
#[4, 7]
元组可以包含多个数据,因此可以使用元组让函数一次返回多个值,如果函数返回的类型是元组,小括号可以省略;如果返回的类型是元组,同时希望单独处理元组中的元素,可以使用多个变量,一次接受函数的返回结果,注意:使用多个变量接受结果时,变量的个数应该和元组中元素个数保持一致
def demo1():
temp=0;
wetness=2;
return temp,wetness
result=demo1()
print(result)
#(0, 2)
type(result)
#<class 'tuple'>
a,b=demo1()
print(a,b)
#0 2
缺省参数:定义函数时,可以给某个参数指定一个默认值,具有默认值的参数叫做缺省参数;调用函数时,如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的参数默认值;函数的缺省参数,将常见的值设置为参数的缺省值,从而简化函数的调用
def demo(person,pet_name='dog')
....
demo(x) #x对应person
多值参数:如果一个函数接收的参数是不确定的,此时可以用多值参数
python中有两种多值参数;参数名齐纳增加一个*可接受元组,参数名前增加两个 ,可接受字典
def demo(num,*nums,**person):
print(num)
print(nums)
print(person)
demo(1)
#1
#()
#{}
demo(1,2,3,4,5,name='小明')
#1
#(2, 3, 4, 5)
#{'name': '小明'}
元组和字典的拆包:在调用带有多值传递的函数时,如果希望讲一个元组变量,直接传递给args;讲一个字典变量直接传递给kwargs就可以使用拆包,简化参数的传递,拆包:在元组变量前增加一个*,在字典变量前增加两个
def demo(*args,**kwargs):
print(args)
print(kwargs)
gl_nums=(1,2,3)
gl_dict={'name':'小明','age':18}
demo(*gl_nums,**gl_dict)
#(1, 2, 3)
#{'name': '小明', 'age': 18}
模块
模块是扩展名为.py的文件;模块同样也是一个标识符,需要符合标识符的命名规则;
在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
注意:直接执行的代码不是像外界提供的工具
模块就如工具包,要想使用这个工具包中的工具,就需要先导入这个模块
导入整个模块
import pizza #pizza.py
导入特定函数
from pizza import function_name
导入之后不需要模块名. ;可以直接使用模块提供的工具。
指定别名
from pizza import function_name as n
注意:别名应该符合大驼峰命名法
导入模块所有函数
from pizza import *
注意:如果两个不同的模块中存在同名的函数,那么后导入模块的函数,会覆盖掉先导入的函数。
python解释器在导入模块时,会搜索当前目录指定模块名的文件,如 果有就直接导入;如果没有,再搜索系统目录。在开发时,给文件起名,不要和系统的模块文件重名。
python中每一个模块都有一个内置属性_ _ file_ _可以查看模块的完整路径
内置属性 _ _ name _ _:可以做到测试模块的代码只在测试情况下被运行,而在被导入时不会执行;记录着一个字符串,如果是被其他文件导入的,则是模块名;如果是当前执行的程序,则是 _ _main _ _
包
包是一个包含多个模块的特殊目录。
包目录下有一个特殊的文件_ _ init _ .py
要在外界使用包中的模块,需要在 _ init _ _.py中指定对外界提供的模块列表。
from . import 模块列表 #从当前目录中导入模块列表
类
三大特性:封装,继承,多态
在日常开发中,不推荐在类的外部给对象增加属性,如果在运行时,没有找到属性,程序会报错,因此对象包含的属性应该封装在类的内部
当使用类名()创建对象时,会自动执行下列操作:为对象在内存中分配空间——创建对象;为对象的属性设置初始值——初始化方法(_ _ init _ _)
当一个对象被从内存中销毁前,会自动调用 _ _ del _ _ 方法
在python中,类是一个特殊的对象——类对象
方法内部需要访问实例属性——实例方法(实例方法内部可以使用类名.访问类属性)
def show(self):
...
对象名.show()
方法内部只需要访问类属性时——类方法
@classmethod
def show(cls):
....
类名.show()
方法内部,不需要访问实例属性和类属性时——静态方法
@staticmethod
def show():
....
类名.show()
继承:
class Car(object):
...
Python中类与类之间可以实现多继承,但是如果不同的类有相同的方法或属性时,尽量避免多继承
在子类的对象方法中,不能访问父类的私有属性,也不能调用父类的私有方法;但可通过公共方法间接的访问到父类的私有属性,私有方法。
如果子类中,重写了父类的方法 ,在使用子类对象调用方法时,会调用子类中重写的方法
如果想调用父类的方法,可使用super().父类方法名()
内置属性_ _ mro _ _ 返回方法搜索顺序
导入类
from car import Car #car为.py文件,Car为car模块中的类
单例设计模式
内置方法___new__:是一个由object基类提供的内置的静态方法;
主要作用:在内存中为对象分配空间,返回对象的引用
使用类名()创建对象时,python解释器首先会调用此方法为对象分配空间
重写此方法一定要return super()._ _ new_ _(cls),否则python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
在调用此方法时需要主动传递cls参数
class MusicPlayer(object):
instance=None
def __new__(cls,*args,**kwargs):
if cls.instance is None:
cls.instance=super().__new__(cls)
return cls.instance
异常
try:
#尝试执行的代码
except 错误类型1:
#针对错误类型对应的代码处理
except (错误类型2,错误类型3):
#针对错误类型对应的代码处理
except Exception as result:
#打印错误信息
else:
#没有异常才会执行的代码
finally:
#无论是否异常,都会执行的代码
异常的传递——当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方,如果传递到主程序,仍然没有异常处理,程序才会被终止。
利用异常的传递性,可在主程序中捕获异常
在开发中,除了代码执行出错python解释器会抛出异常外,还可以主动抛出异常
创建一个Exception的对象,使用raise关键字抛出异常对象
ex=Exception("密码长度不够") #创建异常对象时,可使用错误信息字符串作为参数
raise ex
文件
操作文件的函数/方法
open函数:打开文件,第一个参数是文件名,如果文件存在,返回文件操作对象;如果文件不存在,会抛出异常
默认是以只读方式打开文件
r:只读,即默认模式
w:以只写方式打开文件,如果文件存在会被覆盖;如果不存在,会创建新文件
a:以追加方式打开,如果文件存在,文件指针会放在文件的结尾;如果文件不存在,创建新文件写入
r+,w+,a+:以读写方式打开文件
方法:
read:将文件内容取到内存,一次性读入并返回文件的所有内容
redline:可以一次读取一行内容
write:将指定内容写入文件
close:关闭文件
文件指针
标记着从哪个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件的开始位置
read方法执行后,会把文件指针移动到读取内容的末尾(默认会移动到文件末尾)
如果执行了一次read方法,读取了所有内容,再次调用不能获取到任何内容。
文件/目录的常用管理操作
在Python中,如果想实现这些管理操作,需要导入os模块
rename:重命名文件
remove:删除文件
listdir:目录列表
mkdir:创建目录
rmdir:删除目录
getcwd:获取当前目录
chdir:修改工作目录
path.isdir:判断是否是文件
import os
os.rename(源文件名,目标文件名)
os.remove(文件名)
os.listdir(目录名)
eval函数:将字符串当成有效表达式来求值并返回计算结果