这个是为准备考研复试,希望做一个textCNN文本情感分析打语言基础的自学笔记,博主本身本科非计算机专业,如果网友们有幸看见本文,博客中内容如有疏漏,不吝赐教。
第4节 字典
4.1 字典定义
在Python中,字典(dictionary)是除了列表之外最灵活的数据类型。字典同样可以用来存储多个数据,通常用于存储描述一个物体的相关信息。与列表不同的是,字典的元素是无序的。字典的定义方式为:
- 字典使用key-value对存储数据,key-value对之间使用“,”分隔;
- key是索引;
- value是数据;
- key和value使用“:”分隔;
- key必须是唯一的且只能使用字符串、数字或元组,value可以去任意数据类型(Python允许创建一个空字典)。具体定义代码如下:
#代码在语法上是没有问题的
Flag = 0
dict_demo = {
"name":"Ada",
Flag:"01",
("XYZ","ABC"):("A","X")
}
在实际开发中,所有的key值都是用来描述字典对象的补充,最常用的key值类型就是字符串。针对字典的访问可以通过key进行访问,也可以通过像C语言中访问数组元素那样访问:
print(dict_demo[0])
print(dict_demo["name"])
对于字典key值的增添十分简单,在[]里面直接加入想要增添的key就可以了,或者使用update()。使用pop()和del语句也能删除字典中的元素。
dict_demo["Number"] = 100 #此时key和value都加入到了字典中
dict_demo.update({"Number":200})
# 使用update方法,传入一个字典进去,如果key存在,就会覆盖掉原有的value
# 不存在将会添加进字典中
同时,对于遍历的话。如果直接访问字典元素名,将返回对应的键值对;如果使用了key()或value()方法,将返回对应的key和value。
在实际开发中,常常可以把一些不要求顺序的对象使用字典来定义。甚至可以把多个字典放到一个列表当中。如:
card_list = [{
"name":"ZhangSan",
"qq":1234567,
"Tel:13812345678"},
{"name":"LiSi",
"qq":987654,
"Tel:13212345678",
}]
第5节 函数与模块
5.1 函数初级
和之前学习的语言不同的是,Python定义函数使用了def定义函数,在函数返回值和形参部分可以不声明变量类型。函数列表依然需要用小括号括起来,返回使用return关键字。具体代码示例如下:
def function_01(start_num, end_num):
while start_num <= end_num:
function_01(start_num + 1, end_num)
print("倒计时:%d and End:%d" % (end_num, start_num))
return start_num
function_01(1, 10)
另外,有时候不知道需要多少个形参的时候,可以使用星号“*”进行任意个数的形参传递,如:
def make_pizza(size, *toppings):
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
from pizza import make_pizza as mp
import pizza as p
import pizza import * //类似于java
另外,也可以使用as关键字给函数和模块指定别名,如C中的#define一样。
5.2 模块
这是个类似于Java中“package”概念的东西。只需使用import关键字即可将模块导入到所需要的文件当中,比如:
------------------------------------------------------------------------------------------
# 文件1: my_mode.py中的函数
def show_completed_models(completed_models):
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
------------------------------------------------------------------------------------------
#文件2:mode_demo.py中的函数调用
import my_mode
my_mode.show_completed_models(my_mode.unprinted_designs)
------------------------------------------------------------------------------------------
在网上学习时,也会看到部分代码在import前面加上from关键字,这个问题留到学习类的时候再解决。
另外,在使用Pycharm的时候,初次使用import关键字导入文件可能会遇到需要导入的文件名称下面出现下划线的问题:
只需要把目录文件夹标记成:源码根目录就可以了。
另外,在学习《Python从入门到实践》这本书的时候,里面对应章节也提到了列表切片的概念:
5.3 切片
在书中首次提出切片问题的原因是:有时候,需要禁止函数修改列表。即便对列表操作后,也要保留原来的的列表,以供备案。为解决这个问题,可向函数传递列表的副本而不是原件。要将列表的副本传递给函数,可以像下面这样做:
function_name(list_name[:])
但这似乎并不是切片完整的功能。
一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。
当只有一个“:”时,默认第三个参数step=1;
当一个“:”也没有时,start_index=end_index,看做普通列表。
object[start_index:end_index:step]
# start_index:起始索引,省略时表示从端点开始。
# end_index:终止索引,省略时表示一直到另一端点。
# step:数字表示步长,默认为1;正负号表示方向,默认从左到右
# 当方向为逆向时,start_index应大于end_index,否则将取不到数据
代码示例:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 切取单个元素
print(a[3])
# 切取了第2个到第5个元素,一共3个元素
print(a[1:4])
# 步长为1,方向从右到左
# 正数第9个,到正数第3个,一共6个元素
print(a[8:2:-1])
# 步长为2,方向从右到左
# 正数第9个,到正数第3个,一共中间3个元素
print(a[8:2:-2])
'''
3
[1, 2, 3]
[8, 7, 6, 5, 4, 3]
[8, 6, 4]
'''
print(a[-1:-6:-1]) # 从倒数第一个数9,到倒数第五个数5,步长为1方向负
print(a[-6:-1:2]) # 从倒数第五个数5,到倒数第一个数9,步长为2方向正
print(a[3::2]) # 从正数第四个数3,到末尾,步长为2方向正
print(a[:7:-1]) # 从倒数第一个数9,到正数第8个(倒数第2个),步长1方向负
'''
[9, 8, 7, 6, 5]
[4, 6, 8]
[3, 5, 7, 9]
[9, 8]
'''
既然是切片,为什么在书中说,可以用这句话使用“备份”过的列表呢
function_name(list_name[:])
很容易联想到的是,在“切片”过程中,Python再次为新的列表切片创建了一个新的内存地址,使用id()可以看见:
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(id(a)) # 2152272100224
print(id(a[:])) # 2152301667456
在本次程序执行过程中,切片之后的内存地址和创建产生出来的列表地址并不一样。但是,切片只是浅拷贝 ,它拷贝的是原列表中元素的引用,所以,当存在变长对象的元素时,新列表将受制于原列表。
a = [0, 1, 2, 3]
a.append(a[2:4])
print(a) # [0, 1, 2, 3, [2, 3]]
a = [0, 1, 2, 3]
a[::].extend(a[2:4])
print(a) # [0, 1, 2, 3]
在学习类之后,还会有更多的与切片配合使用的技巧。留到以后学习。
5.4 在函数中传递任意数量的实参
使用*可以将任意数量的实参传递进函数,代码如下:
def make_pizza(size, *toppings):
print("Making a " + str(size) + " inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(12, "mushrooms", "green peppers", "extra cheese")
此时的topping将被视为一个元组,另外也可以接受任意数量的关键字实参,此时其中将引入字典。代码如下:
def build_profile(first, last, **user_info):
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'einstein', location='princeton', field='physics')
print(user_profile)