Python编程小技巧
本文作者:胡思航,中南财经政法大学统计与数学学院
本文编辑:胡艺粼
技术总编:孙一博
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~以往介绍Python编程技巧的文章层出不穷,但是还有很多Python的编程小技巧鲜被提及。因此,小编试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的。让我们一探究竟吧!
变量的交换
在Python编程中,如果我们需要交换变量a和b中的值,通常我们可以定一个临时变量temp,先将a内容存放在temp中,然后将b的值输出给a,再将b设置成临时的变量。
a = 1
b = 2
temp = a #临时变量
a = b
b = temp
不过在Python中,上面这段代码可以进一步简化成下面这样,提高可读性。
a = 1
b = 2
a,b = b,a
运行结果如下:字符串格式化
通常在程序中,如果我们需要组合或者拼接字符串的话,我们可以用“+”来做字符串的连接,如果只是做两个字符串的连接,这样写其实并没有什么问题。
name = "Ross"
print("Hi,I'm" + name)
但是当字符串过多,这样写就会显得非常臃肿,而且,当我们连接整型数据的时候,还需要进行类型的转换,否则程序就会报错。
name = "Ross"
country = "China"
age = 22
print("Hi,I'm" + name + ". I'm from " + country + ". And I'm" + str(age) + ".")
在Python中,我们可以利用format()和花括号语法使其更加的简洁。fromat()在这里是字符串对象的一个方法,调用它会返回被格式化过后的新字符串。而花括号中的内容会被最终替换成format{}函数中传入的各个参数。
print("Hi,I'm {}.I'm from {}. And I'm {}." .format(name,country,age))
使用这种方法的另一种好处是,如果你有重复的需要被替换的内容, 你可以在花括号中写入被替换参数的索引。因此下面两个花括号都会被替换成同一内容。
print("Hi,I'm {0}. Yes, I'm {0}!".format(name))
最后,如果你使用的是Python 3.6以上的版本,你可以使用f-string写法,你只需要在开头加上一个f,花括号中的内容就会被自动的替换成指定表达式的值。注意这里是表达式,比如我们可以将age改成age+1。Python会将表达式运行的结果替换在字符串中。
print(f"Hi,I'm {name}.I'm from {country}. And I'm {age}." )
print(f"Hi,I'm {name}.I'm from {country}. And I'm {age+1}." )
由于这里可以填写任意的表达式,所以你甚至可以调用一个函数的返回值,并替换在字符串中。
运行结果如下:
Yield语法
在这里,我们定义了一个fibonacci()来列举斐波那契数列中的前n个数:
def fibonacci(n):
a = 0
b = 1
nums = []
for _ in range(n):
nums.append(a)
a, b = b, a + b
return num
此时我们在屏幕上打印该数列显示前10个数:
for i in fibonacci(10):
print(i,end=" ")
我们可以修改fibonacci()函数来使用Python中的yield语法:
def fibonacci(n):
a = 0
b = 1
for _ in range(n):
yield a
a, b = b, a + b
return a
for i in fibonacci(10):
print(i,end=" ")
这里的yield表示每当我们计算出一个元素,就立马将这个元素送出去,也就是说,这里外面的for loop中就会立即输出这个数。因此yield使用的好处就是我们并不需要等待整个列表生成完毕后再来一个一个的输出。yield的优势在于一些非常耗时的操作,比如我们可以写一个函数来从网络上下载一系列文档,并输出每个文档的内容,如果我们使用yield语句,则可以保证在一个文档被下载成功后,就立马输出它的内容,而无需等待所有文档都下载完毕。
运行结果如下:
列表解析式
比如说我们有一系列的水果名称存放在一个fruit列表中:
fruit = ["apple","pear","pineapple","orange","banana"]
现在我们希望这些名字都改成大写,我们可以写一个for loop遍历所有名字。
for i in range(len(fruit)):
fruit[i] = fruit[i].upper()
但是在Python中,我们有更简洁的办法,这个方括号语法实际上是在构造一个新的列表,并把它赋值给之前的fruit变量。
fruit = [x.upper() for x in fruit]
运行结果如下:
Enumerate函数
我们继续使用上面的例子,如果我们需要按照顺序输出某一列表中的所有元素,我们可以使用for in的语法。
fruit = ["apple","pear","pineapple","orange","banana"]
for x in fruit:
print(x)
运行结果如下:
如果我们需要按顺序输出某一列表中的所有元素并且得到每一个水果在列表中对应的索引值,我们可以使用enumerate()函数。
fruit = ["apple","pear","pineapple","orange","banana"]
for i,x in enumerate(fruit):
print(i,x)
运行结果如下:
遍历
反向遍历继续沿用水果的例子,如果我们希望将fruit中的元素从后往前依次输出,那么我们需要在遍历元素时加入reversed()函数。
fruit = ["apple","pear","pineapple","orange","banana"]
for i,x in enumerate(reversed(fruit)):
print(i,x)
运行结果如下:
按顺序遍历
如果我们希望输出的元素是按照水果名称的字典顺序,那么我们可以用到Python中的一个内建函数sorted(),该函数会返回一个新的并经过排序后的列表。fruit = ["apple","pear","pineapple","orange","banana"]
for i,x in enumerate(sorted(fruit)):
print(i,x)
运行结果如下:
字典的合并操作
比如说我们有如下两个字典,其中存放不同的用户名和密码:
a = {"ross":"123456","xiaoming":"abc123"}
b = {"lilei":"111111","zhangsan":"12345678"}
那么我们可以写一个程序将这两个字典合并成一个字典:
c = {}
for k in a:
c[k] = a[k]
for k in b:
c[k] = b[k]
在Python中,我们可以将上述代码写成更加简洁的形式:
c = {**a,**b}
这里的两个星号在Python中叫做解包unpacking,也就是说直接将a和b的内容填写到了c中。
运行结果如下:三元运算符
在Python程序中,我们通常会完成这么一项操作:根据某一个条件的不同,将一个变量设置不同的值。比如在下面的例子中,我们会根据score的具体数值来决定s里面的内容是pass还是fail。if score > 60:
s = "pass"
else:
s = "fail"
在Python中,我们可以将代码改成这样:s = "pass" if score > 60 else "fail"
这里的if else称为Python的三元运算符。当if的条件满足时,会输出if前面的值,当if条件不满足时,我们会输出else后面的值。序列解包
我们在这里定义了一个name,里面储存了张三同学的姓和名,如果我们想单独提取出它的姓和名,并把它们存放在不同的变量里,我们可以利用字符串对象的split()方法来将这个字符串按空格分割成多个字符串,然后再利用列表的索引提取出对应的姓和名。name = "San Zhang"
str_list = name.split()
first_name = str_list[0]
last_name = str_list[1]
在Python中,我们可以修改上述程序,使其更加的简洁,这样的操作在Python称为序列解包。name = "San Zhang"
first_name, last_name = name.split()
print(first_name)
print(last_name)
需要注意的是,这里的“序列”其实不一定需要是列表,它可以是元组甚至是range,因为它们都代表一系列元素。运行结果如下:
以上就是对于Python编程中的一些技巧,通过对于命令的观察不难发现一些更加简洁的编程语言,因此梳理常用的编程技巧是有必要的。至此本文关于Python编程的相关技巧已经介绍完毕,不妨动手练习一下叭!
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐 Python与excel交互--xlsxwriter模块
cnmapsearch——离公司最近的快餐店在哪
Python中的异常处理 Python交互式数据可视化——酷炫的Altair库 hk系列命令(3)—— hktrade hk系列命令(2)—— hkar hk系列命令(1)—— hkstock 超好用的字符串方法 基于Python的假设检验实现Stata与MySQL交互--基础操作 Jupyter Notebook中的魔术命令《Stata正则表达式》由中国金融出版社出版发行 匿名函数lambda到底怎么用?Stata绘图系列—NBER Working paper仿图Camelot:从PDF中提取表格数据Stata之计算财务指标——融资约束 列表生成式|让你的代码更简洁Stata绘图系列——玩转绘图通用选项之坐标轴 关于我们微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。