title: Python基础笔记
date: 2020-02-29 20:23:05
updated: 2020-02-29 20:23:05
categories:
tags:
在Python中,一切都是对象,一切都是对象的引用。首先分析下面的赋值语句。
X=5
Python在执行该语句时,其执行过程包含三个步骤:
第一步:创建表示整数5的对象(分配一块内存)。
第二步:检测变量x是否存在,若不存在则创建它
第三步:将变量与对象,通过指针连接起来,从变量到对象的连接称之为引用(变量引用对象)
内存图如下所示:
使用Python变量时必须理解下面几点:
变量没有数据类型的概念,这一点和java C有区别。数据类型属于对象。
变量引用了对象。变量在使用前必须赋值。
例如:
x=5 #创建变量x 引用对象5
print(x+3) #执行时变量x被对象5替代,语句实际为print(5+3)
Python为每一个对象创建一个计数器,计数器记录对象的引用次数。当计数器为0时(即没有任何变量引用时),对象被删除,其占用的内存空间会被自动回收。
例如:
X=5 x=3.3 #使变量x引用浮点数对象3.3,对象5被回收
x=5
y=x #实际执行y=5 ,x和y共同引用变量5
x=6 #给变量引用新对象6 并不影响y的引用
print(x is y)#输出false
Python的主要数据类型有集合、字符串、列表、元组、字典、文件。其中字符串、列表和元组都属于序列,字典属于映射。
集合用{}表示,例如{1,2,3},集合元素是无序、不能重复且不可改变的,相当于java的set数据类型,因此不能将可变对象放入集合中。集合、列表和字典对象均不能加入集合。元组可以作为一个元素加入集合。
集合的一些常用方法如下:
len(集合) #求集合的元素个数
元素 in 集合 #判断某个元素是否属于集合
集合A – 集合B #求差集,用A中不属于B的元素创建新集合
集合A | 集合B #求并集,用A、B两个集合中的全部元素创建新集合
集合A & 集合B #求交集,用同时属于A、B的元素创建新集合
copy() #复制集合
add(元素) #为集合添加一个元素
update(集合) #为集合添加多个元素
remove(元素)/discard(元素) #从集合中删除指定元素
clear() #删除集合中全部元素
字符串是一种有序的字符集合,用于表示文本数据。单引号和双引号无区别,可以相互嵌套,三引号用于表示多行字符串(块字符)。
字符串的一些常用方法如下:
len(字符串) #求字符串长度
元素 in 字符串 #判断字符串是否包含元素
字符串+字符串+字符串 #用加法运算将多个字符串连接
for a in 字符串:print(a) #循环字符串
str(数字) #将数字转换为字符串
count(sub,start,end) #返回子字符串sub在指定范围内出现的次数
endswith(sub,start,end) #判断指定范围内的子字符串是否以sub字符串结尾startswith(sub,start,end) #判断指定范围内的子字符串是否以sub字符串开头
find(sub,start,end) #在指定范围内查找子字符串sub,返回偏移量。没有返回-1
find(sub,start,end) #同find(),返回偏移量,但没有时抛ValueError异常
列表用[]表示,例如:[3,4,’ab’]。列表的主要特点如下:
列表的常用方法如下:
[]/list(列表元素) #创建一个列表
len() #求列表长度
列表A+列表B #合并列表
for a in 列表:print(a) #循环列表
元素 in 列表 #判断元素是否属于列表
append(对象) #在列表末尾添加一个对象
extend(对象) #在列表末尾添加多个对象
insert(索引, 对象) #在指定位置插入对象
remove(对象) #按值删除对象
pop(索引) #按位置删除对象
clear() #删除全部对象
copy() #复制列表
sort() #将列表中的对象排序,若包含多种数据类型则会出错
reverse() #反转对象顺序
元组用()表示,例如:(3,4,’ab’)。元组的主要特点如下:
元组的常用方法如下:
()/tuple() #创建一个元组对象
len() #求元组长度
元组A+元组B #合并元组
for a in 元组:print(a) #元组列表
元素 in 元组 #判断对象是否属于元组
count(对象) #返回指定对象在元组中出现的次数
index(value,start,end) #在指定范围内查找指定值,返回偏移量。没有会报错
字典是一种无序的可变的映射的集合,包含一系列的键值对。字典用{}表示,例如:{‘name’:’Jack’,’age’:18,’sex’:’男’}。字典的主要特点如下:
字典的的常用方法如下:
{}/dict(字典) #创建字典
len(字典) #求长度
键 in 字典 #用于判断字典是否包含某个键
clear() #删除全部字典
copy() #复制字典对象
get(key,default) #返回键key对应的值,若不存在返回default。
pop(key,default) #删除key并返回映射值,若不存在返回default。未指定会报错
items() #返回所有键值对集合
keys() #返回所有键集合
values() #返回所有值集合
Python用内置的open()函数来打开文件,并创建一个文件对象。open()函数基本格式如下:myfile = open(filename,mode) mode为读写模式
文件的读写模式有下面几种:
Python定义函数的基本格式如下:
def 函数名(参数列表):
函数体
return 返回值
参数列表和返回值都不是必须的
Python中的变量无类型属性,变量可引用不同类型的对象。同一个函数,传递的实际参数类型不同时,可获得不同的结果,体现了多态性。例如:
def add(a,b):return a+b #支持+运算的对象均可以作为参数
add(1,3.3) #执行加法运算,返回4.3
add(‘abc’,’de’) #执行字符串连接,返回’abcde’
add((1,2),(3,4)) #执行元组合并,返回(1,2,3,4)
先看一个例子:
add(b=‘abc’,a=’de’) #返回’deabc’
即参数赋值传递与参数的顺序无关
例如:
def f(a): a[0]=’abc’ #修改列表第一个值
x=[1,2,3]
f(x) #调用函数后 x的值变为[‘abc’,2,3]
def f (a):a=100
x=10
f(x) #此时调用函数 x的值还是10。Python函数只改变可变参数。
例如:
def(a,b=20):return a+b #参数b默认值为20
add(1,2) #传递指定参数。返回3
add(1) #未传递实参则取默认值。返回21
在参数前加*可以接受任意个数的参数(或不传),这些参数会保存在一个元组中。例如:
def add(a,*b):
s=a
for x in b:
s+=x
return s
add(1,2) #返回3
add(1,2,3) #返回6
add(1,2,3,4) #返回10
在定义函数时,带星号参数后的参数必须通过赋值传递
def add(a,*b,c):
s=a+c
for x in b:
s+=x
return s
add(1,2,3) #形参c未使用赋值传递会报错
add(1,2,c=3) #可以正常运行
add(1,c=3) #省略带星号参数,可以正常运行
lambda函数用于定义一个匿名函数,可将函数赋值给变量,通过变量调用。其基本格式如下:
lambda 参数表:表达式
例如:
add= lambda a,b:a+b #定义函数并赋值给变量
add(1,2) #调用函数。返回3
lambda函数体中不能使用其他Python函数
Python允许将函数作为列表对象,然后通过列表所以来调用函数。例如:
d=[lambda a,b:a+b,lambda a,b:a*b] #使用lambda函数创建一个列表
d[0](4,5) #调用第一个函数。返回9
d[1](4,5) #调用第二个函数.返回20
在Python中,模块就是一个包含变量、函数或者类的程序文件(*.py)。模块需要先导入才能使用其中的变量或者函数。可使用import或者from语句来导入模块,基本格式如下:
import 模块名称
import模块名称 as 新名称
from 模块名称 import 导入对象名称
from 模块名称 import 导入对象名称 as 新名称
from 模块名称 import*
import语句用于导入整个模块,通过“模块名称.对象名称”的方式来引用;from语句用于导入模块中的指定对象,导入对象可以直接使用,不需要使用模块名称来作为限定符。
例如:
import math
math.fabs(-3)
from math import fabs
fabs(-3)
使用from导入模块时,应注意可修改对象、同名变量(函数)覆盖问题。为避免不必要冲突,尽量用import导入。
下面的模块文件helloworld.py包含了一条赋值语句和一条输出语句,代码如下:
x=100
print("这是模块helloworld.py的输出!")
input("输入任意键退出")
用import导入helloworld模块
可以看出用import导入模块时,重新导入并不会改变模块中变量在之前已经赋的值
用from导入helloworld模块
可以看出用from导入模块时,重新导入会使模块变量初始化
Python提供了reload函数来重新载入并执行模块代码,以初始化相关变量 。使用reload重载模块时,如果模块文件已经被修改,则会执行修改后的代码。如果模块未导入,执行reload重载则会报错。代码如下:
from imp import reload #导入reload函数
reload(模块名) #重载模块
在使用模块导入功能时,不能在import或者from语句中指定模块文件路径,只能依赖于Python模块搜索路径。可以使用标准模块sys的path属性来查看当前搜索路径设置。例如:
Python按照先后顺序依次在path列表中搜索模块。如果要导入的模块不在这些目录中,导入操作失败。通常,sys.path有四部分组成。
在操作系统中设置环境变量PYTHONPATH的值
sys.path列表在程序启动时,自动进行初始化。例如:
图片中标红的地方正是刚刚.pth文件和环境变量中设置的路径。操作模块路径的一些方法(临时操作)如下:
del path[2] #删除第三个路径
path.append(r’路径地址’) #添加一条搜索路径
隐藏模块数据
用from语句导入模块时,以单下划线开头的变量不会被导入。例如:
#helloworld.py
x=100
_y=[1,2]
def _add(a,b):
return a+b
def show():
print("隐藏模块show()执行")
input("输入任意键退出")
在交互模式下导入helloworld.py:
可以看到_y和_add没有导入。
可以在模块文件开头使用__all__变量设置使用from导入时的变量名。例如:
#helloworld.py
__all__=['_y','_add','show'] #设置可导入变量名列表
x=100
_y=[1,2]
def _add(a,b):
return a+b
def show():
print("隐藏模块show()执行")
input("输入任意键退出")
在交互模式下导入模式测试:
只要是__all__列表中的变量名,不管是否以下划线开头均会导入。不在__all__列表中的变量不会被导入。