python基础语法——列表,元组,字典,函数,类,异常,

变量和简单的数据类型

在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函数:将字符串当成有效表达式来求值并返回计算结果


版权声明:本文为shiranjiu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。