Python笔记 财务小白的 day4 python编程基础(
【本文的我,是一个文科财务工作者。在单位信息化全靠人做的年代,确实工作压力大也忙不过来。9102年的我,深感不学习点新知识迟早要被淘汰。所以今天开始记录自己的python小白笔记,各位见笑。】
编程基础部分笔记:《python编程快速上手-让繁琐工作自动化》,AI Sweigart,人民邮电出版社
day4 python编程基础(2)
CH3 函数
1.自定义函数
def hello():
print('Howdy!')
print('Howdy!!!')
print('Hello there.')
hello()
第一行是 def 语句,它定义了一个名为 hello()的函数。 def 语句之后的代码块是函数体。这段代码在函数调用时执行,而不是在函数第一次定义时执行。函数之后的 hello()语句行是函数调用。
(1)def 语句和参数
如果调用 print()或 len()函数, 你会传入一些值,放在括号之间, 在这里称为“参数”。有一个名为 name 的变元。“变元” 是一个变量, 当函数被调用时, 参数就存放在其中。
def hello(name):
print('Hello ' + name)
hello('Alice')
hello('Bob')
(2)返回值和 return 语句
用 def 语句创建函数时, 可以用 return 语句指定应该返回什么值。
import random
def getAnswer(answerNumber):
if answerNumber == 1:
return 'It is certain'
else:
return 'Very doubtful'
r = random.randint(1, 9)
fortune = getAnswer(r)
print(fortune)
请注意,因为可以将返回值作为参数传递给另一个函数调用,所以你可以将最后三行缩写成一行等价的代码:
print(getAnswer(random.randint(1, 9)))
(3)None 值
如果你希望变量中存储的东西不会与一个真正的值混淆,这个没有值的值就可能有用。有一个使用 None 的地方就是 print()的返回值。 print()函数在屏幕上显示文本, 但它不需要返回任何值,那么 print()就返回 None。
(4)关键字参数和 print()
这两个字符串出现在独立的两行中,因为 print()函数自动在传入的字符串末尾添加了换行符。但是,可以设置 end 关键字参数,将它变成另一个字符串。
print('Hello', end='')
print('World')
HelloWorld
传入 sep 关键字参数, 替换掉默认的分隔字符串(空格)。在交互式环境中输入以下代码:
print('cats', 'dogs', 'mice', sep=',')
cats,dogs,mice
2.全局变量和局部变量
处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。
虽然在小程序中使用全局变量没有太大问题,但当程序变得越来越大时, 依赖全局变量就是一个坏习惯。
重要原则:
- 全局作用域中的代码不能使用任何局部变量;
- 但是,局部作用域可以访问全局变量;
- 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量。
- 如果在不同的作用域中,你可以用相同的名字命名不同的变量。也就是说,可以有一个名为 spam 的局部变量,和一个名为 spam 的全局变量。
(1)global 语句
如果需要在一个函数内修改全局变量,就使用 global 语句。如果在函数的顶部有 global eggs 这样的代码
(2)异常处理
错误可以由 try 和 except 语句来处理。那些可能出错的语句被放在 try 子句中。如果错误发生,程序执行就转到接下来的 except 子句开始处。可以将前面除数为零的代码放在一个 try 子句中,让 except 子句包含代码,来处理该错误发生时应该做的事。
def spam(divideBy):
try:
return 42 / divideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
ch4 列表
1.列表数据类型
列表”是一个值, 它包含多个字构成的序列。列表值看起来像这样: ['cat', 'bat', 'rat', 'elephant']。
(1)用下标取得列表中的单个值
image.png
列表也可以包含其他列表值。这些列表的列表中的值,可以通过多重下标来访问,第一个下标表明使用哪个列表值,第二个下标表明该列表值中的值。 像这样:
>>> spam = [['cat', 'bat'], [10, 20, 30, 40, 50]]
>>> spam[0][1]
'bat'
>>> spam[1][4]
50
(2)负数下标
整数值−1 指的是列表中的最后一个下标, −2 指的是列表中倒数第二个下标, 以此类推。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[-1]
'elephant'
(3)利用切片取得子列表
“切片”可以从列表中取得多个值,结果是一个新列表。
spam[1:4]是一个列表和切片(两个整数)。第一个整数是切片开始处的下标。第二个整数是切片结束处的下标。切片向上增长,直至第二个下标的值,但不包括它。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[1:3]
['bat', 'rat']
>>> spam[0:-1]
['cat', 'bat', 'rat']
作为快捷方法,你可以省略切片中冒号两边的一个下标或两个下标。省略第一个下标相当于使用 0, 或列表的开始。省略第二个下标相当于使用列表的长度, 意味着分片直至列表的末尾。
>>> spam[1:]
['bat', 'rat', 'elephant']
(4)用下标改变列表中的值
也可以使用列表的下标来改变下标处的值。例如, spam[1] = 'aardvark'意味着“将列表 spam 下标 1 处的值赋值为字符串'aardvark'。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam[1] = 'aardvark'
>>> spam
['cat', 'aardvark', 'rat', 'elephant']
(5)列表连接和列表复制
+操作符可以连接两个列表, 得到一个新列表,*操作符可以用于一个列表和一个整数,实现列表的复制。
>>> [1, 2, 3] + ['A', 'B', 'C']
[1, 2, 3, 'A', 'B', 'C']
>>> ['X', 'Y', 'Z'] * 3
['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z']
>>> spam = [1, 2, 3]
>>> spam = spam + ['A', 'B', 'C']
>>> spam
[1, 2, 3, 'A', 'B', 'C']
(6)用 del 语句从列表中删除值
del 语句将删除列表中下标处的值, 表中被删除值后面的所有值, 都将向前移动一个下标。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat', 'elephant']
>>> del spam[2]
>>> spam
['cat', 'bat']
(7)用 len()取得列表的长度
len()函数将返回传递给它的列表中值的个数, 就像它能计算字符串中字符的个数一样。
>>> spam = ['cat', 'dog', 'moose']
>>> len(spam)
3
2.使用列表
使用列表的好处在于,现在数据放在一个结构中,所以程序能够更灵活的处理数据,比放在一些重复的变量中方便。
(1)列表用于循环
一个常见的 Python 技巧, 是在 for 循环中使用 range(len(someList)), 迭代列表的每一个下标。
>>> supplies = ['pens', 'staplers', 'flame-throwers', 'binders']
>>> for i in range(len(supplies)):
print('Index ' + str(i) + ' in supplies is: ' + supplies[i])
Index 0 in supplies is: pens
Index 1 in supplies is: staplers
Index 2 in supplies is: flame-throwers
Index 3 in supplies is: binders
(2)in 和 not in 操作符
利用 in 和 not in 操作符, 可以确定一个值否在列表中。 连接两个值: 一个要在列表中查找的值, 以及待查找的列表。这些表达式将求值为布尔值。
>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
(3)多重赋值技巧
多重赋值技巧是一种快捷方式,让你在一行代码中,用列表中的值为多个变量赋值。
>>> cat = ['fat', 'black', 'loud']
>>> size, color, disposition = cat
(4)增强的赋值操作
针对+、 -、 *、 /和%操作符, 都有增强的赋值操作符, 如表 4-1 所示。
image.png
3.方法
(1)用 index()方法在列表中查找值
列表值有一个 index()方法, 可以传入一个值, 如果该值存在于列表中, 就返回它的下标。如果该值不在列表中, Python 就报 ValueError。如果列表中存在重复的值,就返回它第一次出现的下标。
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> spam.index('hello')
0
>>> spam.index('howdy howdy howdy')
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
spam.index('howdy howdy howdy')
ValueError: 'howdy howdy howdy' is not in list
(2)用 append()和 insert()方法在列表中添加值
要在列表中添加新值, 就使用 append()和 insert()方法。前面的 append()方法调用, 将参数添加到列表末尾。 insert()方法可以在列表任意下标处插入一个值。 insert()方法的第一个参数是新值的下标, 第二个参数是要插入的新值。
>>> spam = ['cat', 'dog', 'bat']
>>> spam.append('moose')
>>> spam
['cat', 'dog', 'bat', 'moose']
>>> spam = ['cat', 'dog', 'bat']
>>> spam.insert(1, 'chicken')
>>> spam
['cat', 'chicken', 'dog', 'bat']
请注意, 代码是 spam.append('moose')和 spam.insert(1, 'chicken'),而不是 spam =spam.append('moose')和 spam = spam.insert(1, 'chicken')。
方法属于单个数据类型。 append()和 insert()方法是列表方法, 只能在列表上调用, 不能在其他值上调用,
(3)用 remove()方法从列表中删除值
给 remove()方法传入一个值,它将从被调用的列表中删除。
>>> spam = ['cat', 'bat', 'rat', 'elephant']
>>> spam.remove('bat')
>>> spam
['cat', 'rat', 'elephant']
如果该值在列表中出现多次,只有第一次出现的值会被删除。
如果知道想要删除的值在列表中的下标, del 语句就很好用。如果知道想要从列表中删除的值, remove()方法就很好用。
(4)用 sort()方法将列表中的值排序
数值的列表或字符串的列表, 能用 sort()方法排序。也可以指定 reverse 关键字参数为 True, 让 sort()按逆序排序。
>>> spam = ['ants', 'cats', 'dogs', 'badgers', 'elephants']
>>> spam.sort()
>>> spam
['ants', 'badgers', 'cats', 'dogs', 'elephants']
>>> spam.sort(reverse=True)
>>> spam
['elephants', 'dogs', 'cats', 'badgers', 'ants']
关于 sort()方法,你应该注意 3 件事。
- 首先, sort()方法当场对列表排序。不要写出 spam = spam.sort()这样的代码,试图记录返回值。
- 其次,不能对既有数字又有字符串值的列表排序,因为 Python 不知道如何比较它们。
- 第三, sort()方法对字符串排序时, 使用“ASCII 字符顺序”, 而不是实际的字典顺序。这意味着大写字母排在小写字母之前。因此在排序时, 小写的 a 在大写的Z 之后。
5.类似列表的类型:字符串和元组
列表并不是唯一表示序列值的数据类型。例如,字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作,也可以作用于字符串:按下标取值、 切片、用于 for 循环、 用于 len(), 以及用于 in 和 not in 操作符。
(1)可变和不可变数据类型
但列表和字符串在一个重要的方面是不同的。列表是“可变的”数据类型,它的值可以添加、删除或改变。但是,字符串是“不可变的”, 它不能被更改。
(2)元组数据类型
首先,元组输入时用圆括号(), 而不是用方括号[]。
但元组与列表的主要区别还在于,元组像字符串一样,是不可变的。 元组不能让它们的值被修改、添加或删除。
如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号, 表明这种情况。 否则, Python 将认为, 你只是在一个普通括号内输入了一个值。
(3)用 list()和 tuple()函数来转换类型
函数 list()和 tuple()将返回传递给它们的值的列表和元组版本。
>>> tuple(['cat', 'dog', 5])
('cat', 'dog', 5)
>>> list(('cat', 'dog', 5))
['cat', 'dog', 5]
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
如果需要元组值的一个可变版本,将元组转换成列表就很方便。
(4)引用
A.copy 模块的 copy()和 deepcopy()函数
在处理列表和字典时,尽管传递引用常常是最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。要做到这一点,Python 提供了名为 copy 的模块, 其中包含 copy()和 deepcopy()函数。第一个函数copy.copy(), 可以用来复制列表或字典这样的可变值, 而不只是复制引用。在交互式环境中输入以下代码:
>>> import copy
>>> spam = ['A', 'B', 'C', 'D']
>>> cheese = copy.copy(spam)
>>> cheese[1] = 42
>>> spam
['A', 'B', 'C', 'D']
>>> cheese
['A', 42, 'C', 'D']
如果要复制的列表中包含了列表, 那就使用 copy.deepcopy()函数来代替。deepcopy()函数将同时复制它们内部的列表。