问题来了:
如果你经常用python做一些小的项目玩,或者用python做一些爬虫,又或者你去一些网站刷题,那么必将面对一个问题——写函数。
“写函数”也就是自己写一个算法,用来实现一些功能。比如最简单的给电脑两个参数,让他计算这两个参数的关系。但是函数写作也有写的厉害的和写的怂的。Python要求的是代码简洁。所以之前我在这个网站刷题的时候就很受打击。网址如下。一个牛逼的刷题网站www.codewars.com
打击点在于每道题他会要求一个场景,让你写一个函数做出来。我写一个函数实现这个功能,最终提交的最精简版也可能长达三行,但是里边的大神们(也就是全网公认那道题他拿第一名的大神)几乎都是一行搞定。
比如这个题目:您住在笛卡尔市,那里的所有道路都以完美的网格布局。 您提前十分钟到达预约地点,所以您决定趁机散散步。 恰好该城市在其手机app上为其市民提供了一个“步行生成”应用程序-每次您按下按钮时,都会向您发送一串由一个字母组成的字符串,代表行走的方向(例如[‘n’,‘s’,‘w’, ‘e’]),收到后您就按照NSWE方向依次走下去。
这里有个前提知识是您始终只能在一个方向上走一个街区距离,而且穿越一个城市街区需要一分钟,因此创建一个函数,应用程序给您提供步行信息,如果会花费您正好十分钟,并且能走回原点,则返回true(您不想到早了,也不想迟到),否则返回false。
这道题我的答案是:(首先判断是不是10个字段代表的10分钟,其次能回到原点必定是对应方向的个数要相同,两次否定筛选后,返回True。
# 鄙人代码
def isValidWalk(walk):
if len(walk) != 10 : return False
else:
if walk.count('w') != walk.count('e') or walk.count('s')!= walk.count('n') :return False
else : return True
第一名大神的:提示-他的思路跟我完全相反,直接要求等于10,并且对应相同相等。
# 第一名大神代码:
def isValidWalk(walk):
return len(walk) == 10 and walk.count('n') == walk.count('s') and walk.count('e') == walk.count('w')
ok,如果你懂代码,上边的非常简单,也好理解。而我刚刚洋洋洒洒写了这么多就是想告诉大家,练习写函数是很重要的,因为在数据处理过程中可能需要一些函数来对数据进行归类,或者依据一些数据给某行贴上‘标签’,这些都可以用函数来搞定。
正餐
刻意练习告诉我们——>万事万物你想掌握好,那就需要付出时间去练习,下边献上22个函数构造练习,如果愿意希望你逐行读完,并在自己的环境里亲自跑一遍加深理解。
1. 两个变量互换
两个变量可以通过这种方式互相互换着赋值
a = 5
b = 10
a, b = b, a
print(a) # 10
print(b) # 5
# 这个看起来不是函数,但是这种用法在函数中常用
2. 检查是不是偶数
这个功能主要展示的不是快速判断是不是偶数,而是bool判断的用法.因为10可以被2整除,所以余数为0,因此它是==0的,如果换成`is_even(3)`那就返回False了.
def is_even(num):
return num % 2 == 0
is_even(10) # True
3. 分割一个字符串为一个列表
这个案例使用换行符分割的,实际应用中,随机应变.
def split_lines(s):
return s.split('\n')
split_lines('50\n python\n snippets')
# ['50', ' python', ' snippets']
4. 查找对象使用内存的大小
这个例子中,调用了sys的看内存占用情况函数。数字5占了28内存空间大小,我把这个数字加到9999返回依然是28
import sys
print(sys.getsizeof(5)) # 28
print(sys.getsizeof("Python")) # 55
5. 翻转字符串
这个案例告诉我们字符串的翻转用法,相应的简单字符串可以翻转,以后的图片\音频\视频,一样可以翻转.如果你在一个函数里用这个功能,可以解决某些场景里的问题。
language = "sumer-minus" # SUMER是我公众号,minus是我一个网名
reversed_language = language[::-1]
print(reversed_language) # sunim-remus
6. 打印字符串x遍的小函数
从这里提取两个概念:1如何打印n遍,理解函数调用
def repeat(string, n):
return (string * n)
a=repeat('oop!',10)
print(a)
>>>oop!oop!oop!oop!oop!oop!oop!oop!oop!oop!
7. 检查一个字符串是否与他的翻转相同
这个小代码把字符串翻转,和bool又一次加深理解
def palindrome(string):
return string == string[::-1]
print(palindrome('python')) # False
8. 把一个列表拼装成字符串
用到了列表join方法,数据分析中可能用的多的是pandas的DataFrame格式的矩阵、张量,但一维这些东西一样会遇到使用。
strings = ['老虎', '老鼠', '蟑螂']
print('kill'.join(strings))
# 老虎kill老鼠kill蟑螂
9. 将两个列表删除重复项并合并
如何将两个列表合并并扣除其中的重复项呢?可以看看这个方法,看起来是不是挺“卑鄙”的。挖python墙角感觉,但更好的方法还确实没想出来。实际分析中去重可能不多,但统计众数比较多,如果是string、列表,如何统计重复内容数量,思路类似。
def union(a,b):
return list(set(a + b))
union([1, 2, 3, 4, 5], [6, 2, 8, 1, 4])
# 答案:[1,2,3,4,5,6,8]
10. 将列表去重
def unique_elements(numbers):
return list(set(numbers))
unique_elements([1, 2, 3, 2, 4])
# 答案:[1, 2, 3, 4]
11. 找到一组数字的均值
虽然有mean函数,但比如你想自己算依稀的东西用到mean的时候,你可以自己造个,也就两行而已。
def average(*args):
return sum(args, 0.0) / len(args)
average(5, 8, 2)
# 5.0
12. 检查一个数组是不是都是唯一的数值
def unique(list):
if len(list)==len(set(list)):
print("所有数据都是唯一的")
else:
print("并不唯一")
unique([1,2,3,4,5])
# 所有数据都是唯一的
13. 找到列表频率最大的数据
def most_frequent(list):
return max(set(list), key = list.count)
numbers = [1, 2, 3, 2, 4, 3, 1, 3]
most_frequent(numbers)
# 3
14.角度变弧度
π在math 库中是有定义的,就叫做math.pi
import math
def degrees_to_radians(deg):
return (deg * math.pi) / 180.0
degrees_to_radians(90)
# 1.5707963267948966
15. 打印运行计算花费时间
这个时间跟电脑速度有关
import time
start_time = time.time()
a,b = 5,10 #随便一个过程
c = a+b #随便一个过程
end_time = time.time()
time_taken = (end_time- start_time)*(10**6)
print("运行这个耗费微秒数为:", time_taken)
# 运行这个耗费微秒数为: 2.1457672119140625
16. 找到一组数的最大公因数
借助工具functools
from functools import reduce
import math
def gcd(numbers):
return reduce(math.gcd, numbers)
gcd([24,108,90])
# 6
17. 使用lambda公式-很重要
x = lambda a, b, c : a + b + c
print(x(5, 10, 20))
# 35
# 或者也可以这样
def x(a, b, c):
return a + b + c
print(x(5, 10, 30))
# 35
18. 使用map函数
对一个列表每一个元素都进行操作的话,可以用map函数,下边是个小案例
def multiply(n):
return n*n
list1 =[1, 2, 3]
result = list(map(multiply, list1))
print(result)
# [1, 4, 9]
19. 使用过滤函数-filter
arr = [1, 2, 3, 4, 5]
def Even(x):
return list(filter(lambda x: x % 2 == 0, arr))
Even(arr)
# [2, 4]
20. 列表连续操作
numbers = [1, 2, 3]
def squares(nums):
return [number**2 for number in nums]
squares(numbers)
# [1, 4, 9]
21. 切片操作
切片用于从给定序列中提取元素的连续序列或子序列。 以下函数用于合并两个切片操作的结果。 首先,我们将列表从索引d切到末尾,然后从开始切成索引d。
def rotate(arr, d):
return arr[d:] + arr[:d]
if __name__ == '__main__':
arr = [1, 2, 3, 4, 5]
arr = rotate(arr, 2)
print (arr)
# 结果:[3, 4, 5, 1, 2]
22. 使用链功能
最后的代码段用于从一行开始调用多个函数并评估结果。
def add(a, b):
return a + b
def subtract(a, b):
return a - b
a, b = 5, 10
print((subtract if a > b else add)(a, b)) # 15
print((subtract if a < b else add)(a, b)) # -5
You Need More!