Python应用小坑备忘录

总结了一些常见的Python用法的小坑,以下Python用法信息适用于Python 2.7.13版本。

最近更新时间:2018-01-17


 

1. 使用int()转换为整数型时,会做向下取整。例如int(38.8)会得到38,而不是39

2. 在使用input()和raw_input接收用户输入时,注意前者获得是一个合法的Python表达式,而后者获得的是一个任何字符串。例如input()输入12会得到一个数值,输入3+1会得到4,而输入abcde则会报错,除非abcde是一个变量或常量对象,因为这不是一个合法表达式,如果要输入字符串需要使用'abcde'。而在raw_input中所有被输入的对象都会被转换为字符串,例如还是上面输入,结果会分别得到'12'、'3+1'、'abcde'。

3. =是赋值符号,==是等值判断符合,二者可能用错,尤其在条件判断中会手下笔误的使用=做判断

4. 区别/和%的作用,前者用于取除数的整数,后者用于取余数。例如5/2=2,而5%2=1。/的结果跟分子或分母的类型有关,例如5./2=2.5(而不是2)。

5. continue和break都有类似于“终止”当前程序执行的意思,但前者用于跳过当次的迭代直接进入下一次,而break则直接终止所有迭代,跳到循环外的语句继续执行。

6. 记得对太长的字符串或公式使用换行符。根据PEP 8规范,每行最大长度79,换行可以使用反斜杠,最好使用圆括号,换行点要在操作符的后边敲回车。

7. 使用print输出浮点数并转换为整数时,如果使用d做格式化,那么会“直接截取”整数部分,如果使用f保留0位小数,则会四舍五入。例如n=12.556, print ('The number is: %.0f' % n)的结果是The number is: 13。而print ('The number is: %d' % n)的结果是12。这点跟int()比较类似。

8. 文件目录中尽量使用/而不是\,例如c:/test/a.txt而不是c:\\test\\a.txt,虽然两个语法的结果是相同的,但前者明显更简洁。(当然,更不能用c:\test\a.txt,这是错误的)

9. 使用Python默认的文件读取方法时,记得在最后使用close()将其关闭掉,否则在多个应用都调取该文件或做操作时会由于冲突而报错。另外一个比较好的办法是使用with open() as f这种方法直接读写文件,这样就不用“手动”文件了,它会在该程序执行完之后自动关闭。

10. 文件读取模式的+模式很好用,例如a+,w+等,尤其在测试时无需关注是否有存在文件可以直接做文件写入。但是在生产应用时,注意先清空里面的测试内容。

11. 使用pandas.read_csv指定分隔符时,如果分隔符不是一个符号,例如多列之间通过“|+|”(没错,是三个符号)分隔的,那么分隔符sep的值为"\|\+\|",这是python正则表达式语法。

12. 在使用pandas做数据切分时,使用columns可以直接选择目标列的数据,但下面2种选择后的结果是不同的。例如:

  1. data_pd = pd.DataFrame(np.arange(12).reshape(3,4),columns=['1','2','3','4'])
  2. pd1 = data_pd[['1']]
  3. pd2= data_pd['1']

使用print方法打印后的结果分别如下:

  1. print (pd1)
  2.    1
  3. 0  0
  4. 1  4
  5. 2  8
  6. print (pd2)
  7. 0    0
  8. 1    4
  9. 2    8
  10. Name: 1, dtype: int32

二者看似结果相同,但实际上是不同类型(tyoe)的对象,前者是一个DataFrame,后者是一个Series。这会影响后后续对于该对象的处理,DataFrame和Series也包含了不同的方法。例如:

    • columns值:pd1是有columns方法的,能获取到值为'1'(列名);而pd2是没有columns方法的。
    • 遍历:如果使用for方法遍历pd1,那么只能得到pd1的列名('1');而遍历pd2时,可以得到每个值。当然,如果你愿意,你仍然可以通过pd1.values.tolist()方法获取到pd1中的值,pd2也是如此,但前者获得的是一个嵌套列表的列表[[0], [4], [8]];后者是一个字符串组合的列表[0, 4, 8]。

13. 通常,当数据中包含NaN(空值)时,在做筛选时是无法使用is nan或==nan判断出来的。原因是NaN代表的是一个非浮点数(比如无理数),并不是一个具体数值。例如,使用np.NaN == np.NaN会得到False,而不是True,这跟Python中其他对象跟自身做判断是截然不同的。要判断特定对象中是否包含NaN值或是否是NaN,可以使用np.isnan做判断。方法是:

  1. strs1 = np.nan
  2. print(np.isnan(strs1))
  3. >>True
  4. strs2 = 12
  5. print(np.isnan(strs2))
  6. >>False

但是,当对象的类型是非数值型时,例如字符串,那么会报错TypeError。例如:

  1. strs3 = 'ab'
  2. print(np.isnan(strs3))
  3. >>...TypeError: ufunc 'isnan' not supported for the input typesand the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

此时,可以配置try except来解决该问题,即在try中通过np.isnan(object)判断,如果得到true执行缺失值处理方法;如果得到false进行数值型处理方法;如果报错,则执行其他处理方法,具体处理方法要根据实际对象的类型而定。

  1. try:  # 如果为空
  2.     np.isnan(strs3)
  3.     #执行特定方法
  4. except TypeError:  # 如果不为空,会报错
  5.     #执行特定方法

 

14. 在使用sklearn的GridSearchCV做超参数优化时,可能会报错sklearn.externals.joblib.my_exceptions.JoblibValueError错误,出现这种错误通常由于存在版本问、参数配置或代码层面有问题,但只通过这个错误信息是无法找到根源的,解决方案通常有三种:

  • 使用from sklearn.model_selection import GridSearchCV来代替from sklearn.grid_search import GridSearchCV来使用最新的库引用
  • 使用pip install -U scikit-learnconda install scikit-learn更新sklearn到最近版本
  • 将GridSearchCV中的n_jobs值设置为1,然后再次运行,此时会出现真正导致错误的原因的错误提示,找到原因并修复;然后再次设置n_jobs=-1,此时就可以正常运行。

====================【好书推荐,我为自己代言】====================

《Python数据分析与数据化运营》上市啦!

50+数据流工作知识点
14个数据分析与挖掘主题
8个综合性运营分析案例
涵盖会员、商品、流量、内容4大主题
360°把脉运营问题并贴合数据场景落地


本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:
  • 标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile
  • 统计分析:Statsmodels
  • 中文处理:结巴分词
  • 文本挖掘:Gensim
  • 爬虫和解析:requests、Beautiful Soup、xml
  • 图像处理:OpenCV和PIL
  • 数据读取:xlrd、pymongo、mysql.connector
  • 数据预处理:imblearn
  • 展示美化类:Matplotlib、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus
如果你对以下内容感兴趣,那么本书将值得一看:
  • KMeans聚类的自动K均值的确立方法
  • 基于软方法的多分类模型组合评估模型的应用
  • 基于自动下探(下钻、细分)的应用
  • 基于增量学习的多项式贝叶斯分类
  • pipeline管道技术的应用
  • 基于超参数的自动参数值的优化方法
  • 特征自动选择
  • 文本分类、文本主题挖掘
  • 基于自动时间序列ARIMA的P、D、Q的调整
  • python决策树规则输出
  • 基于自定义图像的文本标签云
  • 非结构化数据,例如图像、音频、文本等处理
  • 对象持久化处理
有关这本书的写作感受、详细内容介绍、附件(含数据和代码源文件-源代码可更改数据源直接使用)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》新书上线,要购买此书请直接点击图片或扫描二维码去京东购买

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>