社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

小结 python 实战中遇到的几种需要化名的情境

刘娟娟🍀PRESS.ONE • 5 年前 • 444 次点击  
阅读 26

小结 python 实战中遇到的几种需要化名的情境

笑来在《自学是门手艺》的《2.4.3 化名与匿名》中,讲到了函数的化名。经过几个月的实战,我发现,实际上化名无处不在。我有时也会称之为“别称”,意思一样。函数化名只是化名的一种应用场景,还有好几种使用化名的地方,本篇笔记将整理小结我所遇到的各种化名。

情境A:导入时化名

导入其它模块时,直接化名为简约版,是我相当常用的,甚至有一些业界约定俗成的化名。无论是模块,模块中的函数或变量,都可以此种方式化名简化之。

# 业界约定俗成的一些化名
import pandas as pd
import numpy as np
# 自定义模块与自定义函数的化名
from zhihu_base import get_all_topics_detail as zhihu
复制代码

我编程时给函数或变量命名的习惯是,让人一看到名字就能知道该它是做什么的,如此以来名称就会挺长。函数因为要被调用,尤其是外部调用,写的复杂点倒能理解。但如果是一个不被外部调用的变量,为什么不直接在定义变量时就定义一个简约的名字呢?

情境B:同一行语句多次调用名字,临时简化

这里有一种情境,调用该变量的大部分语句都相对简约,用全称更易读,但偶尔有一句复杂的语句,要多次调用该变量,导致该语句特别长,此时要临时要用一个变量化名,简化代码。


sql_search = 'select url_token,zhihu_name,lase_active_time from zhihu_whos_v;'
df_topics_details = pd.read_sql(sql_search,conn)
# 这里省略很多代码
# 此时出现一条相对复杂冗长的语句,多次出现该变量名
df_value_v = df_topics_details[(df_topics_details['upvotecount']>100000) & (df_topics_details['last_activity']>'2019-09-01') ]

复制代码

该语句是为了把 df_topics_details 这个数据集之中,符合条件 upvotecount > 100000last_activity >'2019-09-01'的数据筛选出来,是 pandas 中相当常用的语句。后来我发现,在这种多次调用某个变量名或函数名的语句中,可以临时加一个化名,来简化该语句长度。像这样:


df_topics_details = dtd
df_value_v = dtd[(dtd['upvotecount']>100000) & (dtd['last_activity']>'2019-09-01') ]

复制代码

但是这种化名,并不适合在定义该变量时就如此做。试想我一开始就把该变量定义为 dtd,其余许多行代码会极其不易读——我或者代码的其它读者完全无法理解dtd指代什么。如果更多变量都采用这种风格,代码的可读性将有多糟糕啊!

情境C:文件对象化名

其实文件对象化名这个说法倒不准确,本质上是变量的赋值:把一个特定的文件对象赋值给一个变量来指代保管。单独拎出来,是因为它太高频使用了。类似fw或者frwriter也是约定俗成的命名习惯。

实例 X:

fw = open("my_test.txt", "at")
fw.write("xue.cn 月收费仅15元,对编程自学者相当友好。")
fw.close()
复制代码

实例Y:

with open("my_test.txt", "at") as fw:
    fw.write("xue.cn 可以在网页上一边阅读一边在线写代码。")
复制代码

实例Z:

comms_file = output_path + 'xuecn_comments_statistics_' + str(datetime.datetime.now())[:10] + '.xlsx'
with pd.ExcelWriter(comms_file) as writer:
	comms_counts_monthly.to_excel(writer, sheet_name='留言月报')
	comms_counts_weekly.to_excel(writer, sheet_name='留言周报')
	comms_counts_daily.to_excel(writer, sheet_name='留言日报')
	comms_by_reg_date.to_excel(writer, sheet_name='每日激活用户的留言情况')
	comms_by_reg_week.to_excel(writer, sheet_name='每周激活用户的留言情况')
	comms_counts_by_hour.to_excel(writer, sheet_name='留言活跃时段')
	vote_by_name.to_excel(writer, sheet_name='用户获赞')
	name_count_by_vote.to_excel(writer, sheet_name='用户获赞的分布')
	vote_by_content.to_excel(writer, sheet_name='留言获赞')
	content_count_by_vote.to_excel(writer, sheet_name='留言获赞的分布')
复制代码

情境D:化名是通用的操作

如我上一篇笔记提及,sql 语句也有“化名”的方法,用的关键词和python导入时所用到的 as 是一样的。


with data as(
  select 
    date(created_at) as time,
    user_id
  from user_comments
  union all
  select 
    date(created_at) as time,
    user_id
  from user_activities
)
select
  time,
  count(distinct user_id) as 每日学习用户数
from data
group by time
order by time

def who_is_v_detail

复制代码

小结

我比较少细究某个化名,到底是对函数、变量或对象进行化名。核心在于,化名只是给名字复杂的东西,另外取了一个简单好记的指代他,不管名字如何,那东西的特性不变,所指代的总还是ta。

好似某个人叫“因缺思厅·尼古拉斯·蒋·巴斯帝国五世·一品带刀侍卫·阿拉斯加·狗蛋·王”,你可以简称他:老王。

“化名”是编程和日常生活中普遍存在的现象,只不过具体在某个语言中,它通过什么关键词或语法来实现而已。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/47181
 
444 次点击