Python学习笔记

本文详细梳理了Python的基础知识,包括数据类型、字符串函数、元组、列表、字典、集合的使用。深入探讨了列表的常用操作如append、extend、sort以及列表映射与过滤。此外,介绍了文件操作、异常处理、测试断言、正则表达式以及Python生态中的datetime库和jieba库。文章旨在帮助读者巩固Python知识,提升编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章还没有更新完,主要是对Python知识点做一些梳理。

一、数据类型

基本数据类型:int、float、bool(int的子类)、complex
组合数据类型:str、tuple、list、dict、set
不可变数据类型:int、float、complex、bytes、str、tuple

二、字符串函数

常用函数

len(s) 求字符串长度
s.count(sub) 求子串sub出现的次数,重叠部分不会重复计算,例如"AAA"中子串"AA"只出现一次
s.upper()、s.lower() 返回一个新的字符串(不改变原来的字符串),是原来字符串的大/小写
s.find(sub) 从头查找子串sub并返回子串下标,查找失败则返回-1
s.find(sub, index) 从下标index处查找子串sub并返回子串下标,查找失败则返回-1
s.index(sub) 功能同find,不同之处是查找失败会引发异常
s.rfind(sub) 从尾查找子串sub并返回子串下标,查找失败则返回-1
s.rindex(sub) 功能同rfind,不同之处是查找失败会引发异常
s.replace(old, new) 返回一个新的字符串(不改变原来的字符串),将原来字符串中所有的子串old替换成new
s.isdigit()、s.isupper()、s.islower() 判断字符串是否是数、是否全是大/小写
s.startswith(sub)、s.endswith(sub) 判断字符串是否以某个子串开头/结尾
s.strip() 返回一个新的字符串(不改变原来的字符串),去除字符串头尾的空白字符(空格、’\r’、’\t’、’\n’)
s.lstrip() 返回一个新的字符串(不改变原来的字符串),去除字符串头部的空白字符(空格、’\r’、’\t’、’\n’)
s.rstrip() 返回一个新的字符串(不改变原来的字符串),去除字符串尾部的空白字符(空格、’\r’、’\t’、’\n’)
s.strip(x)、s.lstrip(x)、s.rstrip(x) 同上,但去除的是x中出现的字符

字符串格式化

1.format
{序号:对齐 宽度.精度 类型} 宽度可以是0
^:中对齐
>:右对齐
<:左对齐

x = "Hello {0} {1:>10},you get ${2:0.4f}".format("Mr.", "Jack", 3.2)
print(x) #>>Hello Mr.      Jack,you get $3.2000

2.%

print("Today is %s.%d" % ("May", 21)) #Today is May.21

3.f"{变量名}"

first_name = "ada"
last_name = "lovelace"
full_name = f"{first_name} {last_name}"
print(f"Hello, {full_name.title()}!") #Hello, Ada Lovelace!

转义字符

Python中提供了\不转义字符串的用法,r表示字符串中的\就是\,示例如下:

print(r"ab\ncd") #>>ab\ncd

三、元组

元组是Python中一种不可变的数据类型。元组是由逗号标识的,圆括号的作用只是让其看起来更整洁、更清晰。定义一个只有一个元素的元组时,需以逗号结尾:

tup = ("123",)

元组的运算

以下运算建立了新的元组,并没有改变元组的值。
1.元组的连接

tup = (10, 20)
tup += (30, 40)
print(tup) #>>(10, 20, 30, 40)

2.元组的乘法

tup = (10, 20)
tup = tup * 3
print(tup) #>>(10, 20, 10, 20, 10 ,20)

3.比较大小
两个元组逐个比较大小,直到分出胜负。若有两个对应元素不可比大小,则抛出runtime error。

元组生成式

结构大体为tuple(求值表达式 取值范围),示例如下:

print(tuple(x*x for x in range(1, 11)))	#>>(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)

四、列表

列表里放的是指针。

列表的+=、+和append的区别

对列表来说,a += b 和 a = a + b是不同的。
a += b是直接将列表b中的元素添加到列表a的末尾;
a = a + b将列表b元素添加到列表a末尾,会得到一个新的列表,不会影响到原先的列表。
append的作用是添加单个元素至列表的末尾,与+=不同。

b = a = [1, 2]
a += [3]
print(a, b) #>>[1, 2, 3] [1, 2, 3]
a = a + [4, 5]
print(a) #>>[1, 2, 3, 4, 5]
print(b) #>>[1, 2, 3]
a.append([4, 5])
print(a) #>>[1, 2, 3, 4, 5, [4, 5]]

列表的乘法

类似于元组的乘法,这里不赘述。

列表的排序

Python自带的排序函数sort和sorted的时间复杂度O(nlog(n))。list.sort(key = myKey),sort函数按照每个元素调用函数myKey的返回值从小到大进行排序,示例如下:

def myKey(x):
	return x % 10
mylist = [25, 7, 16, 33, 4, 1, 2]
mylist.sort(key = myKey)
print(mylist) #>>[1, 2, 33, 4, 25, 16, 7]

常用函数

append(x) 添加x到列表尾部
extend(x) 添加列表x中的元素到列表尾部
insert(index, x) 将元素x插入到列表下标index处
remove(x) 从列表中删除元素x
reverse() 颠倒整个列表
index(x) 查找元素x,返回第一次出现的下标,找不到则抛出异常
copy() 浅拷贝

列表映射map

map(function,sequence),可用于将一个序列(列表、元组、集合等)映射到另一个序列。返回值为一个延迟求值的对象, 可以转化为list、tuple、set等。示例如下:

def f(x):
    print(x, end="")
    return x*x
a = map(f, [1, 2, 3])	#没有输出,因为实际上没有执行函数f
print("list(a):", end="")	
print(list(a))	#>>list(a):123[1, 4, 9]
print(tuple(a))	#>>()
a = list(map(lambda x : 2*x, [2, 3, 4]))
print(a)	#>>[4, 6, 8]

列表过滤filter

filter(function,sequence),抽取序列中令function(x)为True的元素。返回值为一个延迟求值的对象, 可以转化为list、tuple、set等。示例如下:

def f(x):
    return x % 2 == 0
lst = tuple(filter(f, [1, 2, 3, 4, 5]))
print(lst)	#>>(2, 4)

列表生成式

结构大体为[求值表达式 取值范围],用法可以有很多,这里只举两个例子:

print([[m + n for m in 'ABC'] for n in 'XYZ'])	#>>[['AX', 'BX', 'CX'], ['AY', 'BY', 'CY'], ['AZ', 'BZ', 'CZ']]
L = ['Hello', 'World', 18]
print([s.lower() for s in L if isinstance(s, str)])	#>>['hello', 'world']

列表的深拷贝

由于列表中存储的是指针,所以list[ : ]进行的是浅拷贝,对于列表中的可变数据类型,改变其值仍会影响原来的列表。Python提供了copy.deepcopy来实现列表的深拷贝,示例如下:

import copy
a = [1, [2]]
b = copy.deepcopy(a)
b.append(4)
print(b) #>>[1, [2], 4]
a[1].append(3)
print(a)	#>>[1, [2, 3]]
print(b)	#>>[1, [2], 4]

元组和列表互转

用list和tuple实现互转,示例如下:

a = [1, 2, 3]
b = tuple(a)
c = list(b)
t = (1, 2, 3)
(a, b, c) = t	#a=1, b=2, c=3
s = [1, 2, 3]
[a, b, c] = s	#a=1, b=2, c=3

元组、列表和字符串互转

print(list("hello"))	#>>['h', 'e', 'l', 'l', 'o']
print("".join(['H', 'i', '!']))	#>>Hi!
print(tuple("hello"))	#>>('h', 'e', 'l', 'l', 'o')
print("".join(('H', 'i', '!')))	#>>Hi!

五、字典

Python3.5及以前字典的键值对是无序的,Python3.6及以后字典的键值对是有序的(加入字典的顺序)。字典的键必须是不可变的数据类型且内容不相同,若内容相同,则字典会自动去除重复的部分,只留下一个。从运行结果来看,留下的是最后一个示例如下:

a = (1, 2, 3)
b = (1, 2, 3)
d = {(1, 2, 3) : 50, a : 60, b : 70, (1, 2, 3) : 80}
print(d[a])	#>>80
print(d[b])	#>>80
print(d[(1, 2, 3)])	#>>80

字典的构造

通过dict函数构造,示例如下:

items = [('name', 'Gumby'), ('age', 21)]
print(dict(items))	#>>{'name': 'Gumby', 'age': 21}
print(dict(name='Gumby', 'age'=21))	#>>{'name': 'Gumby', 'age': 21}

常用函数

clear() 清空字典
keys() 取字典的键的序列(非list、tuple和set)
items() 取字典的键值对的序列
values() 取字典的值的序列
pop(x) 删除键为x的键值对,若x不在字典中,则抛出异常
copy() 浅拷贝
基于items的两种遍历方式,示例如下:

d = {(1, 2, 3), 80}
for k, v in d.items():
    print(k)	#>>(1, 2, 3)
    print(v)	#>>80
for i in d.items():#元组
    print(i[0])	#>>(1, 2, 3)
    print(i[1])	##>>80

补充:python的内置函数dir() 不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

六、集合

集合中的元素必须是不可变的数据类型。集合中的元素没有顺序,不支持通过下标访问。

集合的构造

空集合输出set()。字典转化为集合时,只取字典的键。

print(set([]))	#>>set()
print(set({1 : 2, 'ok' : 3, (3, 4) : 4}))	#>>{1, 'ok', (3, 4)}

常用函数

add(x) 添加元素x,若存在,则不添加
clear() 清空集合
copy() 浅拷贝
remove(x) 删除元素x,若x不存在,则抛出异常
update(x) 将序列x中的元素加入到集合中

集合的运算

x in a、a | b、a & b、a - b、a ^ b。
a <= b a是b的子集;a < b a是b的真子集。

七、文件

常用函数

open(filepath, pattern,encoding=“encoded”) 返回一个表示文件的对象。第一个参数是路径名,表示目录结构时用斜杠(/),使用反斜杠进行转义(\)。第二个参数是模式参数:读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)和读写模式(‘r+’),缺省为只读模式。若以写入模式打开文件,文件不存在,则会创建一个新的文件,前提是文件的上一级目录存在;若文件存在,则会清空该文件内容后再返回。第三个参数指定文件的编码,encoded为编码的名字,缺省为系统编码。
f.write(string) 向文件写入内容,string只能是字符串。
f.read() 返回一个字符串,包括文件的全部内容。
f.readlines() 返回一个列表,列表的元素为字符串,内容为文件的一行,包括换行符。
f.readline() 返回一个字符串,内容为文件的一行,包括换行符。空行也有一个字符’\n’。
f.close() 关闭文件。

文件读取

关键词with在不再需要访问文件后将其关闭,不需要程序员调用close,但文件对象的作用域仅限于with中。可对文件对象使用for循环来依次访问每一行,示例如下:

with open("1.txt") as f:
	for line in f:
		print(line, end="")

亦可以调用readlines来进行读取,使代码的可读性更强,示例如下:

with open("1.txt") as f:
	lines = f.readlines()
	for line in lines:
	print(line, end="")

也可以调用readline来进行读取,示例如下:

with open("1.txt") as f:
	while True:
		line = f.readline()
		if line == ""
			break
		print(line, end="")

当前路径

程序可以通过调用os.getcwd()来获得当前文件夹的路径,即.py所在的文件夹(但以命令行方式运行程序时,打印的是cmd的当前文件夹),还可以调用os.chdir(dir)来改变当前文件夹,示例如下:

import os
print(os.getcwd())	#>>当前文件夹的绝对路径
os.chdir("c:/tmp")
print(os.getcwd())	#>>c:/tmp

os库和shutil库中的文件夹操作函数

os.getcwd() 求程序的当前文件夹
os.chdir(dir) 将当前文件夹设置为dir
os.listdir(dir) 返回一个列表,列表里是文件夹dir中的所有文件和文件夹的名字(不是路径)
os.mkdir(dir) 创建文件夹dir
os.path.getsize(file) 获得文件file的大小,单位是字节
os.path.isfile(file) 判断file是不是文件夹
os.remove(file) 删除文件file
os.rmdir(dir) 删除文件夹dir,dir必须是空文件夹
os.rename(x, y) 将文件或文件夹x改名为y。该函数还可以起到移动文件或文件夹的作用。例如,os.rename(“c:/tmp/a”, “c:/tmp2/b”)可以将文件或文件夹"c:/tmp/a"移动到 文件夹"c:/tmp2/"下,前提是tmp2必须存在
shutil.copyfile(x, y) 拷贝文件x到文件y,若y已存在,会发生覆盖

##命令行参数
可以在命令行中输入python 文件名 参数来运行程序。Python提供了sys.argv来获得程序的命令行参数,示例如下:

import sys
for x in sys.argv:
	print(x)

使用json存储数据

Python提供了json(JavaScript Object Notation)包让程序员能够将简单的Python数据结构转储到文件中。JSON数据格式其他编程语言亦可以使用。json.dump()函数将数据存储到文件中,它接收两个参数:第一个参数是要存储的数据,第二个参数是要存储到的文件对象。json.load()函数将数据从文件加载到内存中,接收一个文件对象的参数。示例如下:

import json
numbers = [2, 3, 5]
filename = 'numbers.json'
with open(filename, 'w') as f:
	json.dump(numbers, f)
with open(filename, 'w') as f:
	numbers = json.load(f)
print(numbers)	#>>[2, 3, 5]

八、异常

若except中不对异常做任何处理,可以使用pass语句来明确的告诉Python,pass还充当了占位符的作用,以后要处理可以进行修改。else代码块中应该放入依赖try代码块执行成功的代码。

try:
	#代码块
except ZeroDivisionError: #捕获的异常
	#代码块/pass语句
else#代码块

九、测试

断言方法

Python提供了模块unittest来实现对代码的测试,该模块提供了以下几种常用的断言方法:
assertEqual(a, b)
assertNotEqual(a, b)
assertTrue(x)
assertFalse(x)
assertIn(item, list)
assertNotIn(item, list)

测试类

要测试的类如下:

class AnonymousSurvey:
	"""收集匿名调查问卷的答案"""

	def _init_(self, question):
		"""存储一个问题,并为存储答案做准备"""
		self.question = question
		self.responses = []
	
	def store_response(self, new_response):
		"""存储单份调查答卷"""
		self.responses.append(new_response)
	#略去其他方法

编写对应的测试类需要继承unittest.TestCase类。程序员可以编写setUp方法,该方法会在每个测试方法被调用前调用,因此可以在该方法中实现测试前的初始化。每个测试方法必须以test_开头,否则不会被自动运行。
第24、25行的if代码块检查特殊变量_name_,这个变量在程序执行时设置,若该文件作为主程序执行,则该变量被设置为’main’,在这里,调用unittest.main()来运行测试用例。每完成一个单元测试,Python都打印一个字符:通过–句点;错误–E;断言失败–F。示例如下:

import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
	"""测试AnonymousSurvey类"""
	
	def setUp(self):
		"""创建一个调查对象和一组答案,供使用的测试方法使用"""
		self.my_survey = AnonymousSurvey(question)
		self.responses = ['English', 'Spanish', 'Mandarin']
		
	def test_store_single_response(self):
		"""测试单个答案会被妥善地存储"""
		self.my_survey.store_response(self.responses[0])
		self.assertIn(self.responses[0], self.my_survey.responses)
	
	def test_store_three_responses(self):
		"""测试三个答案会被妥善地存储"""
		for response in self.responses:
			self.my_survey.store_response(response)
		for response in self.responses:
			self.assertIn(response, self.my_survey.responses)
			
if _name_ == '_main_':
	unittest.main()

十、正则表达式

regex包re

match

re.match(pattern, string, flags=0) 从字符串string的起始位置匹配一个模式pattern,若成功,则返回一个匹配对象,否则返回None。flags为标志位,用于控制模式串的匹配方式,如:是否区分大小写,多行匹配等等,例如(re.M | re.I)表示忽略大小写且多行匹配。

search

re.search(pattern, string, flags=0) 功能同re.match,不同之处是对匹配的位置没有要求,从左到右返回第一个匹配成功的匹配对象。

findall

re.findall(pattern, string, flags=0) 在正则表达式中没有分组时,查找字符串中所有和模式匹配的子串(不重叠)放入列表;在正则表达式中有且仅有一个分组时,每个元素是一个匹配子串中分组对应的内容;在正则表达式中有超过一个分组时,每个元素是一个元组,每个元组对应于一个匹配的子串,元组里的元素,依次是1号分组、2号分组、3号分组…匹配的内容(若分组没匹配到任何东西(受到’|‘的影响),则显示空串’’)。没有匹配的子串则返回空表[]。

finditer

re.finditer(pattern, string, flags=0) 查找字符串中所有和模式匹配的子串(不重叠),每个子串对应于一个匹配对象,返回匹配对象的序列(可调用迭代器)。

sub

re.sub(pattern, substring, string) 把母串string中匹配的子串替换为substring。

split

分隔串用|隔开,两个相邻的分隔串之间会隔出一个空串’’,示例如下:

import re
a = 'Beautiful, is; better*than\nugly'
print(re.split(';| |,|\*|\n', a))
#>>['Beautiful', '', 'is', '', better, 'than', 'ugly']

匹配对象

属性

string:匹配时使用的母串
lastindex:最后一个被匹配的分组的编号(不一定是最大的分组编号,有可能存在嵌套的情况)。如果没有被匹配的分组,则为None

函数

r.group([n1, n2, …]) 返回一个由元组,元组的元素依次是第n1、n2、…分组匹配到的子串。 没有匹配的子串则返回None。
r.group() 等价于r.group(0),返回整个匹配到的子串。
r.group(i) 返回第i个分组匹配到的子串。
r.groups([default]) 返回一个元组,每个元素为每个分组所匹配到的子串,若分组没匹配到任何东西(受到’|'的影响),则以default替代,缺省为None。
r.groupdict([default]) 返回以有名字的组的名字为键、以该组匹配的子串为值的字典,default用法同上。
r.start([group]) 返回指定的组匹配的子串在string中的起始位置,group缺省为0。
r.end([group]) 返回指定的组匹配的子串在string中的结束位置(闭区间),group缺省为0。
r.span() 返回匹配到的子的起止位置(start, end),end是闭区间。

边界符号

\A 表示字符串的左边界
\Z 表示字符串的右边界
^ 同\A,但还可以用于多行匹配模式
$ 同\Z,但还可以用于多行匹配模式
\b 表示此处是单词的左边界或右边界
\B 表示此处不允许是单词的左边界或右边界,即不可是单词字符
注:python中’\b’是一个字符表示删除(BACKSPACE),因此正则表达式在使用边界符号’\b’时,要写成’\b’。

分组

括号中的表达式是一个分组。多个分组按左括号从左到右从1开始编号。
在分组的右边可以通过分组的编号引用该分组所匹配的子串,示例如下:

import re
m = r"(((ab*)c)d)e \ 3"	#\数字 是转义字符
r = re.match(m, "abbbcdeabbbkfg")	#后面的三个b少一个都不能成功匹配
print(r.group(3))	#>>abbb
print(r.group())	#>>abbbcdeabbb 

分组后跟量词,并不要求每次出现的内容都相同。例如(ab*)*,并不要求每次b的个数都相同。

'|'的用法

‘|‘表示或,起作用的范围是直到整个正则表达式的开头或结尾或另一个’|’,若用于分组中,则起作用的范围仅限于分组内。’|'具有从左到右短路匹配的特点。

匹配方式

量词的贪婪模式

量词+,*,?,{m,n},默认匹配尽可能长的子串。

量词的懒惰模式

量词+,*,?,{m,n}后面加?,则匹配尽可能短的子串。

十一、Python的生态

datatime库

datatime能处理的时间是公元1年至9999年。
1.处理日期

import datetime #导入datetime模块
dtBirth = datetime.date(2000,9,27) #创建日期对象,日期为2000年9月27日
print(dtBirth.weekday()) #>>2 输出dtBirth代表的日期是星期几。0表示星期一
dtNow = datetime.date.today() #取今天日期,假设是 2020年8月15日
print(dtBirth < dtNow) #>>True 日期可以比大小
life = dtNow - dtBirth #取两个日期的时间差
print(life.days, life.total_seconds()) #>>7262 627436800.0
#两个日期相差7262天,即627436800.0秒
delta = datetime.timedelta(days = -10) #构造时间差对象,时间差为-10天
newDate = dtNow + delta #newDate代表的日期是dtNow的日期往前数10天
print(newDate.year, newDate.month, newDate.day, newDate.weekday()) 
#>>2020 8 5 2 2020年8月5日星期三
print(newDate.strftime(r'%m/%d/%Y')) #>>08/05/2020
newDate = datetime.datetime.strptime("2020.08.05", "%Y.%m.%d")
print(newDate.strftime("%Y%m%d")) #>>20200805

2.处理时刻

import datetime 
tm = datetime.datetime.now() #取当前时刻,精确到微秒
print(tm.year,tm.month,tm.day,tm.hour,tm.minute,tm.second,
tm.microsecond)
#>>2020 8 15 20 32 53 899669 假设当前时刻是2020年8月15日20时32分53秒899669微秒
tm = datetime.datetime(2017, 8, 10, 15, 56, 10,0)
#构造一个时刻,2017年8月10日15时56分10秒0微秒
print(tm.strftime("%Y%m%d %H:%M:%S")) #>>20170810 15:56:10
print(tm.strftime("%Y%m%d %I:%M:%S %p")) #>>20170810 03:56:10 PM
tm2 = datetime.datetime.strptime("2013.08.10 22:31:24", 
"%Y.%m.%d %H:%M:%S") #由字符串生成一个时间对象
delta = tm - tm2 #求两个时间的时间差
print(delta.days,delta.seconds,delta.total_seconds())
#>>1460 62686 126206686.0 #时间差是1460天零62686秒,总共126206686.0秒
delta = tm2 - tm
print(delta.days,delta.seconds,delta.total_seconds())
#>>-1461 23714 -126206686.0
delta = datetime.timedelta( days = 10, hours= 10,minutes=30,seconds=20)
#构造一个时间差,10天10小时30分20秒
tm2 = tm + delta
print(tm2.strftime("%Y%m%d %H:%M:%S")) #>>20170821 02:26:30

random库

random.random() 随机生成一个[0,1]之间的数
random.uniform(x,y) 随机生成一个[x,y]之间的数(含两端,下同)。x,y可以是小数
random.randint(x,y) 随机生成一个[x,y]之间的整数。x,y都是整数
random.randrange(x,y,z) 在range(x,y,z)中随机取一个数,z为步长且y不算在内
random.choice(x) 从序列x中随机取一个元素。x可以是为列表、元组、字符串
random.shuffle(x) 将列表x的元素顺序随机打乱
random.sample(x,n) 从序列x中随机取一个长度为n的子序列。x可以是元组、列表或集合
random.seed(x) 设置随机种子为x。x可以是数、元组或字符串

jieba库

解决分词问题。

import jieba #导入分词库
s = "我们热爱中华人民共和国"
lst = jieba.lcut(s) #分词的结果是一个列表
#默认用精确模式分词,分出的结果正好拼成原文
print(lst) #>>['我们', '热爱', '中华人民共和国']
print(jieba.lcut(s,cut_all = True)) #全模式分词,输出所有可能的词
#>>['我们', '热爱', '中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国']
print(jieba.lcut_for_search(s)) #搜索引擎模式分词
#>>['我们', '热爱', '中华', '华人', '人民', '共和', '共和国', '中华人民共和国']
s = "拼多多是个网站"
print(jieba.lcut(s)) #>>['拼', '多多', '是', '个', '网站']
jieba.add_word("拼多多") #往jieba的词典添加新词
print(jieba.lcut(s)) #>>['拼多多', '是', '个', '网站']
s = "高克丝马微中"
print(jieba.lcut(s)) #>>['高克丝', '马微', '中']
jieba.load_userdict("c:/tmp/tmpdict.txt")	#高克 丝马 微中
print(jieba.lcut(s)) #>>['高克', '丝马', '微中']
print(jieba.lcut("显微中,容不得一丝马虎。")) #优先选择常见的词
#>>['显微', '中', '容不得', '一丝', '马虎', '。']

openpyxl库

用于处理excel文档(office 2010之后.xlsx文件)。

import openpyxl as pxl
book = pxl.load_workbook("c:/tmp/test.xlsx") #book就是整个excel文件
sheet = book.worksheets[0] #取第0张工作表,和以下代码等价:
#sheet = book.active #取活跃的工作表(缺省就是第0张工作表)
#sheet = book["price"] #取名为" price "的工作表
print(sheet.title) #输出工作表名字(显示于工作表下方标签)
print(sheet.min_row, sheet.max_row) #输出最小有效行号、最大有效行号
print(sheet.min_column, sheet.max_column) #输出最小有效列号、最大有效列号
for row in sheet.rows: #按行遍历整个工作表,从第1行到sheet.max_row行(含)
for cell in row: #遍历一行的每个单元格。cell是一个单元格
print(cell.value) #cell.value是单元格的值,空单元格值是None
for cell in sheet['G']: #遍历名为'G'的那一列
print(cell.value)
for cell in sheet[3]: #遍历第3行
print(cell.value, type(cell.value),cell.coordinate,
cell.col_idx,cell.number_format) 

#单元格属性
#type(cell.value) : int, float ,str, datetime.datetime
#cell.coordinate : 'A2', 'E3'
#cell.col_idx : 单元格列号
#cell.number_format : 数的显示格式,"General", "0.00%", "0.00E+00"等

for sheet in book.worksheets: #worksheets是工作表构成的列表
print(sheet.title)	#遍历所有工作表,并打印其名字
sheet['E2'].value = 12.5 #单元格值为小数
sheet["E2"].number_format = "0.00%" #单元格显示格式是百分比形式
sheet['F1'].value = 3500 #单元格值类型为int
sheet['F2'].value = "35.00" #单元格值类型为str
sheet['F3'].value = datetime.datetime.today().date()
sheet.column_dimensions['F'].width = len(str(sheet['F3'].value))
sheet.row_dimensions[2].height = 48 #设置第2行高度为48 points
sheet2 = book.create_sheet("Sample2") #添加名为Sample2的工作表
sheet2["A1"] = 50 
sheet2 = book.create_sheet("Sample0",0) #添加名为Sample0的工作表
sheet3 = book.copy_worksheet(sheet) #添加一张新工作表,其为sheet的拷贝
book.remove_sheet(book["Sample2"]) #删除名为Sample2的工作表
book.save('c:/tmp/sample.xlsx') #保存文件

十二、作用域

Python中的作用域只有四种,即LEGB规则:
L, local – 在lambda函数内或者def函数内部的变量
E, Enclosing-function – 闭包的作用域 外部嵌套函数的命名空间
G,Global – 全局作用域 所在模块(文件)的命名空间
B, Build-in – 内建(内置)作用域 Python内置模块的命名空间
只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。
在if-elif-else、for-else、while、try-except/try-finally等关键字的语句块中并不会产生作用域。
有以下四条法则,用于判断一个变量是全局的还是局部的:
1.若变量在全局作用域中使用(即所有函数之外),它就总是全局变量。
2.若在一个函数中,有针对该变量的global语句,它就是全局变量。
3.否则,若该变量用于函数中的赋值语句,它就是局部变量。
4.但是,若该变量没有用在赋值语句中,它就是全局变量。
且在一个函数中,一个变量要么总是全局变量,要么总是局部变量。示例如下:

def spam():
	global eggs #不能同时进行赋值
	eggs = 1 #global
def bacon():
	eggs = 2 #local
def ham():
	print(eggs)	#global
eggs = 42 #global

详细内容链接:Python作用域问题详解

十三、代码风格

变量名只能包含字母、数字和下划线且不能以数字开头。,一般以小写字母开头。
类名采用驼峰命名法–单词首字母大写而不使用下划线。
实例名、模块名和函数名均采用小写格式,并在单词之间加上下划线。
先导入标准库模块,再添加一个空行,然后导入自己编写的模块。
一个空行分隔:类中的方法,代码内容
两个空行分隔:类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值