python 函数——结构化思维

文章目录

  • 引言
  • 函数基础
  • 其他知识
  • 总结
  • 参考

引言

说到函数,想必大家都知道,初中某天数学课上,光头的老师不耐其烦地给我们讲述着函数这样一个概念,我们则再春风地诱惑下向往梦乡。也曾经有不知道多少脑细胞在和函数的战斗中阵亡,线性函数、二次函数、指数函数、三角函数、简单函数、复杂函数、特殊函数、复变函数、泛函数…总有一款让你爽一爽

函数基础

一时说的太远,忘记怎么讲python的函数了!编程语言中的函数可以理解地更简单点,就是实现一个功能或者变换,基本语法是:

def func(*args, **kwarg)
	"""函数说明"""
	...
	return res

以上包含

  • 函数名称,func可以是chifan、shuijiao、da_doudou
  • 函数的输出参数,参数可以有两类,一类是是普通参数,类似一个变量名;另一类是关键字参数,可以传入某人值。函数并不一定需要参数这个东西,比如你大喊,这个动作可以简单定义为
def dahan():
	print("啊啊啊啊")

当然你可以通过一个参数来设定大喊的时间(次数)

def dahan(t):
	print("啊"*t)

你觉得一般人只能大喊三声,然后就没劲了,于是次数可以设定默认值

def dahan(t = 3):
	print("啊"*t)
  • 函数主体,上一个例子就是print的过程,函数主体可繁杂可简,可咸可甜… 函数又可以套函数,除了套别人还可以套自己(迭代器)… 总之只要你想得到,就可以用函数来实现。(不排除一些复杂的数学问题,其实你更根本想不到 ,扎心!)
  • 函数返回值,以前老是总是说函数是一个映射,从一个集合映射到一个集合,输入x总是能得到一个y,套用到python函数也是可以的,就是返回值了。当然并不是所有函数都需要函数返回值,比如上面解释的就没有。函数返回值可以是一个,也可以是多个。多个其实可以理解为一个,想到把多个返回值打包为一个元组
return a, b, c 和 return (a, b, c)是等价的

最开始学python的时候总是不知道python有多个返回值怎么用呢?其实很简单

def  func_007():
	a = b = c = 1
	return a, b, c

e, f, g = func_007()

以上函数就是调用函数007,e,f, g被赋值为1

  • 函数说明,个人喜欢用三个双引号,函数说明不言而喻了,就是说明函数用来干啥的?你说的越清楚,使用者越方便,特别是第三方使用的时候,函数说明可以帮助他人快速使用起来,节约时间,不用推敲你的代码具体实现逻辑。这个类推到做项目,你的项目文档做的越好,使用方会越舒服,对你项目的认可也会越好。(虽然我的说明写的稀烂,但是教科书shi经验不可否认…)

其他知识

  • 函数参数的一些问题。我们给一个函数传递一个参数的时候是值传给参数,比如
# 调用前面的dahan ,实际是把tx的值赋给了变量t
tx=5
dahan(t=tx)  

上面的情况很好理解,但是也存在不好理解的情况:

a = []
def func_008(d):
	d.append(1)
	d = 1
func_008(a)
print(a)

上面调用函数后,a最后变成[1]。其实很奇怪的,我们只是把a传给了函数,通常情况下我们认识的函数,是一个封装,函数内部运算应该不会影响外部的变量。怎么理解上面的过程呢?

  • a=[], a是一个空数组的引用,调用fun_008(a), 相当于d=a,d也成了对空数组的引用,d和a指向相同的数据而不是给d一个新的数据(新的数据可理解为使用新的内存),

  • d.append(1)相当于给空数组添加1,因为此时a、d指向同一个数组,a自然是[1]

  • 然后d=1,这个时候d被指向另一个数据1,并不是修改原来的空数组,不会改变a
    说得有点绕,回头在捋一捋。

  • lambda表达式, lambda其实可以理解为一种简洁地函数第一方式,不需要通过关键字def来声明函数。我个人经常在排序的时候使用到lambda表达式

a = [(liming, 10), (hanmeimei, 99), ('xiaoai', 88)]
sorted(a, key=lambda x: x[1], reversed=True)

通过以上排序我们知道liming确实学习成绩很糟糕。lambda表达式其实返回给我们一个函数对象,输入时x,输出是x的第二个元素。对这里说道了函数对象,python里面一切都是object,object都可以作为参数进行传递。

  • 关于为什么需要函数?a)最直接的原因,函数是对功能的封装,实现了一些功能,可以支持复用。比如上面我们定义了dahan这个函数,无论任何时候我们想要大喊的时候都可以调用dahan,减少了重复开发的成本。当然这个函数比较简单,复用不复用没那么重要。当你的函数能够实现复杂功能时,效果就明细了,比如我们都很喜欢调用numpy库的函数。b)封装后也更好维护,相同的功能我们只需要维护一个函数就好了,即使出问题了,我们只要改函数中代码就好。c)还讲一下个人在使用函数的收获,当你要实现一整套算法时,你可能先想这个算法的过程分为哪几个大的部分,然后每个部分可以切分为具体哪些小部分,最后具体实现小部分的功能。这个过程可以简单地用下面的例子来论证
# 一天历程

def chifan():
	print("我该吃啥")
	print("我吃饱了") 
	...
def da_doudou():
	...
def shuijiao():
	...

chifan()
da_doudou()
shuijiao()

你实现你一天怎么过的时候,你一下子想到了吃饭、打豆豆、睡觉,然而吃饭并不简单,里面有思考,有犹豫,有享受、有吃饱后的空虚寂寞冷…这就是结构化思维,利用函数我们可以很好地结构化编程,写出来的函数思路清晰、骨骼惊奇 … 一看就是练武奇才我这里有一本武功秘籍…飘了

总结

啥也不说了,各位大侠是时候动手写写函数了…

参考

  • 《python自然语言处理》
  • 廖大师python基础教程

你可能感兴趣的:(python,python,编程语言)