让自己的代码更加pythonic

前一段时间学习了python,不过仅仅掌握了一些基本语法和操作之后就去忙其他事情了。最近开始弄项目了,发现在用python写脚本时还是不够熟练。经过大佬的指点之后学到了好多python的技巧,为了不让自己忘记,想写一篇文章记录一下自己学习python的过程,让自己的代码更加pythonic。

读写不同类型文件的操作

  • txt文件:使用os包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os
1.直接打开(python3)
with open(vectors_dir,'rb') as f:
data = str(f.read(),encoding="utf-8") # 同样是将文件改为 utf-8 类型,然后进行
data = data.split('\n')
2.对多层包含文件夹的操作
def getText(folder_path):
folder_list = os.listdir(folder_path) # 查看folder_path下所有文件
for folder in folder_list:
new_folder_path = os.path.join(folder_path, folder)
files = os.listdir(new_folder_path)
for file in files:
with open(os.path.join(new_folder_path, file), 'r', encoding='utf-8') as f:
lines = f.readlines()
for i in range(len(lines)): # 按行读取
lines[i] = lines[i].strip()
dataList.append(lines[0:-1]) # 添加所有权限信息
labelList.append(lines[-1]) # 添加所有类别信息
return dataList, labelList
  • csv/excel文件:使用pandas包
1
2
3
4
import pandas as pd
data_train = pd.read_csv('data/train.csv')
df.to_csv('data/baseline.csv', index=False)

列表的使用

直接定义一个列表

1
fr2_list = []

切片操作

切片操作的对象不仅仅列表,也可以对字符串进行操作

1
cursor.execute(sql.format(permission=fr_list[i][:-1], information=fr1_list[i][:-1]))

这里的fr_list是指一个列表,而fr_list[i][:-1]代表fr_list的第i个元素的从第一个位置到最后一个字母。例如,一个这样的列表[‘Michael’, ‘Sarah’, ‘Tracy’],当i是1时,fr_list[i][:-1]的结果就是’Sara’。
有时也会用到[::]的第三个参数,第三个参数表示隔位切片,例如list[::2]就表示每个两个元素将列表(或字符串)将元素输出。这个参数也可以取负数,当取-1时表示按倒序切片,以此类推。

区分extend与append

python 列表类型自带的extend()和append()方法。这两个方法功能类似,但是在处理多个列表时,这两个方法的处理结果是完全不同的。

1
2
3
a = [1,2,3]
b = [4,5,6]
a.append(b)

输出a:

[1, 2, 3, [ 4, 5, 6]]

1
2
3
a = [1,2,3]
b = [4,5,6]
a.extend(b)

输出a:

[1 ,2, 3, 4, 5, 6]

python函数

python中有很多函数可以很大程度的简化操作,这就是为什么python是世界上最好的脚本语言。

range函数

range()函数中,参数是数字,一般用在for循环语句中,常用形式如下:

1
2
3
4
5
6
7
for i in range(len(fr_list)):
# 表示从1到5
range(1,5)
# 表示从1到5,间隔2(不包含5)
range(1,5,2)
#表示从0到5
range(5)

join()函数

join()方法用于将序列中的元素以指定的字符连接生成一个新的字符串。使用join函数可以很方便的将列表以一定格式输出。

1
2
3
4
5
6
7
print temp_list
print "".join(temp_list)
print "-".join(temp_list)
输出为:
['a9', 'cd', 'ae', 'c3']
a9cdaec3
a9-cd-ae-c3

map函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

将一个python字符串转化为16进制

1
2
3
4
input='111111'
list = map(hex, map(ord, input))
输出为:
['0x31', '0x31', '0x31', '0x31', '0x31', '0x31']

首先,将字符串input通过ord()函数转化为其ASCII码,map函数会自动将input字符串转化为列表然后通过map函数返回一个存放每个字符ASCII码的列表,然后再用hex()函数将其转化为16进制数。

字典

  • get():dict.get(key, default=None),获取字典中指定键的值,如果不存在该键就返回default值
  • items():dict.items()以列表返回可遍历的(键, 值) 元组数组(相当于把字典转化为可遍历的数组)
1
2
3
d={'a':20,'b':15,'c':30}
print(d.items())
输出:dict_items([('a', 20), ('b', 15), ('c', 30)])

sort与sorted函数

sorted函数与列表中的sort函数不同,sort函数只能对list中的元素进行排序,而sorted对所有可迭代的序列都是适用的。而且sort是内置函数,会改变当前对象,而sorted()函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。

  1. sort(fun,key,reverse=False)
    • 参数fun表示此sort函数是基于何种算法进行排序的,一般默认是python中的归并排序,一般不会重写该参数
    • 参数key用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序
    • 参数reverse是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序
1
2
3
4
5
6
7
8
9
10
list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]
#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为1处的元素进行排序
list1.sort(key=itemgetter(1))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]
#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为2处的元素进行排序
list1.sort(key=itemgetter(2))
print list1
# [(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]
  1. sorted(fun,key,reverse=False),其参数同sorted,这里不作解释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from operator import attrgetter
class Data:
article_name = str()
readers = 0
def __init__(self,tpl):
self.article_name = tpl[0]
self.readers = tpl[1]
def getKey(self):
return self.readers
def __str__(self):
return str(str(self.article_name)+str(':')+str(self.readers))
list1 = [Data(("java",100)),Data(("c++",100)),Data(("python",89)),Data(("c++",90))]
#此处调用attrgetter函数使得按照readers进行排序
list2 = sorted(list1,key=attrgetter("readers"))
"""
python:89
c++:90
java:100
c++:100
"""
#此处使得list1先按照article_name进行排序,对于名字相同的再按照readers进行排序
list3 = sorted(list1,key=attrgetter("article_name","readers"))
"""
c++:90
c++:100
java:100
python:89
"""
#使用类中的自定义函数也同样可以操作
list4 = sorted(list1,key = Data.getKey)
"""
python:89
c++:90
java:100
c++:100
"""

使用pymysql进行数据库操作

在python中,一般使用pymysql进行数据库的增删查改操作

创建连接

使用pymysql新建一个sql连接,在其中填上自己的数据库信息

1
2
3
4
5
6
7
8
9
connect=pymysql.Connect(
host='localhost',
port=3306,
user='root',
passwd='123456',
db='android',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor
)

其中,cursorclass=pymysql.cursors.DictCursor这句话表示查询的数据以字典形式显示,如果想以列表形式查询,将这句话去掉即可。

进行sql操作

1
2
3
4
5
# 首先获取游标
cursor=connect.cursor()
# 新建sql语句
# sql="select * from user"
# cursor.execute(sql)

当进行增删查改操作时,如果需要操作的属性比较多,可以用这样的方式操作

1
2
3
4
5
sql = "insert into total_permission(permission,information) VALUES ('{permission}','{information}')"
for i in range(len(fr_list)):
cursor.execute(sql.format(permission=fr_list[i][:-1], information=fr1_list[i][:-1]))
print(fr_list[i])
connect.commit()

可以使用字符串的format函数与sql语句中定义的变量进行对应,其中[:-1]是为了过滤掉’\n’(这是自己数据的问题),不要忘了在插入、删除、更新操作后都要加上connect.commit()语句,否则不会执行操作。

python(python3)使用中要注意的

  • 由于除法‘/’自动产生的类型是浮点型,将’/‘改为’//‘就是整型数了
1
2
train_data = np.concatenate((x_neg[len(neg_words)//10:],x_pos[len(neg_words)//10:]),axis=0)
train_label = np.concatenate((y_neg[len(neg_words)//10:],y_pos[len(neg_words)//10:]),axis=0)

Powered by Hexo and Hexo-theme-hiker

Copyright © 2016 - 2019 Dreaouth All Rights Reserved.

访客数 : | 访问量 :