Python基础笔记

怎么运行写好的Python程序

  • 直接双击
  • cmd进入文件所在目录输入python helloworld.py命令按回车;再执行helloworld.py

变量

变量与对象

在Python中,一切都是对象,一切都是对象的引用。首先分析下面的赋值语句。

X=5

Python在执行该语句时,其执行过程包含三个步骤:
第一步:创建表示整数5的对象(分配一块内存)。
第二步:检测变量x是否存在,若不存在则创建它
第三步:将变量与对象,通过指针连接起来,从变量到对象的连接称之为引用(变量引用对象)

内存图如下所示:
在这里插入图片描述
使用Python变量时必须理解下面几点:
变量没有数据类型的概念,这一点和java C有区别。数据类型属于对象。
变量引用了对象。变量在使用前必须赋值。

例如:

1
2
x=5  #创建变量x 引用对象5
print(x+3) #执行时变量x被对象5替代,语句实际为print(5+3)

对象的垃圾回收

Python为每一个对象创建一个计数器,计数器记录对象的引用次数。当计数器为0时(即没有任何变量引用时),对象被删除,其占用的内存空间会被自动回收。
例如:

1
X=5  x=3.3 #使变量x引用浮点数对象3.3,对象5被回收

变量的共享引用

1
2
3
4
x=5
y=x #实际执行y=5 ,x和y共同引用变量5
x=6 #给变量引用新对象6 并不影响y的引用
print(x is y)#输出false

数据类型

Python的主要数据类型有集合、字符串、列表、元组、字典、文件。其中字符串、列表和元组都属于序列,字典属于映射。

集合

集合用{}表示,例如{1,2,3},集合元素是无序、不能重复且不可改变的,相当于java的set数据类型,因此不能将可变对象放入集合中。集合、列表和字典对象均不能加入集合。元组可以作为一个元素加入集合。

集合的一些常用方法如下:

1
2
3
4
5
6
7
8
9
10
len(集合)            #求集合的元素个数
元素 in 集合 #判断某个元素是否属于集合
集合A – 集合B #求差集,用A中不属于B的元素创建新集合
集合A | 集合B #求并集,用A、B两个集合中的全部元素创建新集合
集合A & 集合B #求交集,用同时属于A、B的元素创建新集合
copy() #复制集合
add(元素) #为集合添加一个元素
update(集合) #为集合添加多个元素
remove(元素)/discard(元素) #从集合中删除指定元素
clear() #删除集合中全部元素

字符串

字符串是一种有序的字符集合,用于表示文本数据。单引号和双引号无区别,可以相互嵌套,三引号用于表示多行字符串(块字符)。

字符串的一些常用方法如下:

1
2
3
4
5
6
7
8
9
10
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’]。列表的主要特点如下:

  • 列表可以包含任意类型的对象
  • 列表是一个有序序列
  • 列表是可变的。可以添加或者删除列表成员,列表对象可直接修改。
  • 列表存储的是对象引用而不是对象本身

列表的常用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[]/list(列表元素)  #创建一个列表
len() #求列表长度
列表A+列表B #合并列表
for a in 列表:print(a) #循环列表
元素 in 列表 #判断元素是否属于列表
append(对象) #在列表末尾添加一个对象
extend(对象) #在列表末尾添加多个对象
insert(索引, 对象) #在指定位置插入对象
remove(对象) #按值删除对象
pop(索引) #按位置删除对象
clear() #删除全部对象
copy() #复制列表
sort() #将列表中的对象排序,若包含多种数据类型则会出错
reverse() #反转对象顺序

元组

元组用()表示,例如:(3,4,’ab’)。元组的主要特点如下:

  • 元组可以包含任意类型的对象
  • 元组是一个有序序列
  • 元组是不可变的。不可以添加或者删除元组成员,元组对象也不能改变。
  • 元组存储的是对象引用而不是对象本身

元组的常用方法如下:

1
2
3
4
5
6
7
8
()/tuple()        #创建一个元组对象
len() #求元组长度
元组A+元组B #合并元组
for a in 元组:print(a) #元组列表
元素 in 元组 #判断对象是否属于元组
count(对象) #返回指定对象在元组中出现的次数
index(value,start,end) #在指定范围内查找指定值,返回偏移量。没有会报错

字典

字典是一种无序的可变的映射的集合,包含一系列的键值对。字典用{}表示,例如:{‘name’:’Jack’,’age’:18,’sex’:’男’}。字典的主要特点如下:

  • 字典键一般用字符串,字典值可以是任意类型(包括字典)
  • 字典是无序可变的映射
  • 字典存储的是对象引用而不是对象本身

字典的的常用方法如下:

1
2
3
4
5
6
7
8
9
10
11
{}/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为读写模式
文件的读写模式有下面几种:

  • w:写文件。创建新文件,若已存在覆盖原文件
  • a:以追加方式写文件。若文件不存在会创建新文件
  • r:读文件
  • b:访问二进制文件。例:wb、ab、 rb
  • +:可同时进行读写操作。如open(file,’w+’)表示以写方式打开文件同时可读

函数

定义函数

Python定义函数的基本格式如下:

1
2
3
4
def 函数名(参数列表):
函数体
return 返回值

参数列表和返回值都不是必须的

函数的参数

参数的多态性

Python中的变量无类型属性,变量可引用不同类型的对象。同一个函数,传递的实际参数类型不同时,可获得不同的结果,体现了多态性。例如:

1
2
3
4
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)

参数赋值传递

先看一个例子:

1
add(b=‘abc’,a=’de’)   #返回’deabc’

即参数赋值传递与参数的顺序无关

可变参数可在函数中被修改

例如:

1
2
3
4
5
6
7
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函数只改变可变参数。

有默认值的参数

例如:

1
2
3
def(a,b=20):return a+b        #参数b默认值为20
add(1,2) #传递指定参数。返回3
add(1) #未传递实参则取默认值。返回21

传递任意个数的参数

在参数前加*可以接受任意个数的参数(或不传),这些参数会保存在一个元组中。例如:

1
2
3
4
5
6
7
8
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

必须通过赋值传递的参数

在定义函数时,带星号参数后的参数必须通过赋值传递

1
2
3
4
5
6
7
8
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函数用于定义一个匿名函数,可将函数赋值给变量,通过变量调用。其基本格式如下:
lambda 参数表:表达式
例如:

1
2
add= lambda a,b:a+b                    #定义函数并赋值给变量
add(1,2) #调用函数。返回3

lambda函数体中不能使用其他Python函数

函数列表

Python允许将函数作为列表对象,然后通过列表所以来调用函数。例如:

1
2
3
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语句来导入模块,基本格式如下:

1
2
3
4
5
import 模块名称
import模块名称 as 新名称
from 模块名称 import 导入对象名称
from 模块名称 import 导入对象名称 as 新名称
from 模块名称 import*

import语句用于导入整个模块,通过“模块名称.对象名称”的方式来引用;from语句用于导入模块中的指定对象,导入对象可以直接使用,不需要使用模块名称来作为限定符。

例如:

1
2
3
4
import math
math.fabs(-3)
from math import fabs
fabs(-3)

使用from导入模块时,应注意可修改对象、同名变量(函数)覆盖问题。为避免不必要冲突,尽量用import导入。

执行模块

下面的模块文件helloworld.py包含了一条赋值语句和一条输出语句,代码如下:

1
2
3
x=100
print("这是模块helloworld.py的输出!")
input("输入任意键退出")

用import导入helloworld模块
在这里插入图片描述
可以看出用import导入模块时,重新导入并不会改变模块中变量在之前已经赋的值


用from导入helloworld模块
在这里插入图片描述
可以看出用from导入模块时,重新导入会使模块变量初始化

重新载入模块

Python提供了reload函数来重新载入并执行模块代码,以初始化相关变量 。使用reload重载模块时,如果模块文件已经被修改,则会执行修改后的代码。如果模块未导入,执行reload重载则会报错。代码如下:

1
2
from imp import reload           #导入reload函数
reload(模块名) #重载模块

模块搜索路径

在使用模块导入功能时,不能在import或者from语句中指定模块文件路径,只能依赖于Python模块搜索路径。可以使用标准模块sys的path属性来查看当前搜索路径设置。例如:
在这里插入图片描述
Python按照先后顺序依次在path列表中搜索模块。如果要导入的模块不在这些目录中,导入操作失败。通常,sys.path有四部分组成。

  • 程序的当前目录
  • Python标准库文件
  • 任何.pth文件包含的目录(手动配置)
  • 操作系统的环境变量PYTHONPATH中包含的目录(手动配置)
    .pth文件通常放在Python安装目录中,例如D:\Python35,文件名可以随意取。.pth文件中,每个目录占一行,可包含多个目录,例如:
    F:\myCodes\ECMAScript6
    F:\Desktop

在操作系统中设置环境变量PYTHONPATH的值
在这里插入图片描述
sys.path列表在程序启动时,自动进行初始化。例如:
在这里插入图片描述
图片中标红的地方正是刚刚.pth文件和环境变量中设置的路径。操作模块路径的一些方法(临时操作)如下:

1
2
del path[2]                 #删除第三个路径
path.append(r’路径地址’) #添加一条搜索路径

隐藏模块数据
用from语句导入模块时,以单下划线开头的变量不会被导入。例如:

1
2
3
4
5
6
7
8
9
#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导入时的变量名。例如:

1
2
3
4
5
6
7
8
9
10
#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__列表中的变量不会被导入。