如何简单粗暴理解函数

一、初次见面,请多关照。
# 计算列表内的元素个数。
# 用编程去计算
li=[1,2,3,4,5,6,6,5,4]
count=0
for i in li:
count += 1
print(count)
# 如果再计算字符串的元素个数还得再写一段同样的代码。

# 重复代码较多。
# 可读性差。
# 解决上述问题就需要 函数式编程 。

# 用函数去计算。设计一个函数,用一段代码解决同一类问题。
# 只要一调用函数名,函数就执行,就可以算出。不用再造重复程序。
# 所以,函数名必须具有可描述性,要不然怎么知道这个函数是什么功能,函数一多了就乱了。
# 函数名的命名规范和变量的命名规范一样。
a=len(li)
print(a)
# len 就是一个函数。

# 函数的作用:
# 避免重复代码,增强可读性。
# 函数的特点:
# 以功能为导向。

# 函数能针对不同的对象使用。
# 用函数写代码,代码的利用率较高。
二、认识一下。
#  def 函数名:(英文的冒号)
# pass (函数体)

# 程序看到def这个关键字就会知道这是一个函数,函数体里面的内容先不执行。
# 因为他不知道你要用函数干什么,所以先把函数体存下来。
# 等下面用到的时候再执行函数。但是程序怎么知道你要用函数呢?
# 这就需要你给她一个提醒,只要一看见函数名加(),就知道你要用函数了,他就会执行函数体里面的内容。
# 执行完函数之后得有一个结果啊,因为函数的功能就是通过函数体的计算让调用者得到一个结果的。
# 所以,就得有一个东西把结果抛出来,这个东西就是return关键字,
# 只要程序一看到这个关键字,就会结束函数体,把结果抛给执行者,这个结果就是返回值。
# 返回值有单个的,也有多个的,单个的直接扔出去就行了,但是多个的怎么一下子仍出去啊,一抖漏全都乱了,
# 所以,如果是多个值,他会以元组形式返回,先打包,再把包扔出去。
三、原来如此。
# 之前说到函数是要经过处理得到一个结果的,那么就需要考虑了,
# 既然函数有处理不同对象的功能,那么,他是怎么做到的呢?
# 这就涉及到了函数的参数,和函数的传参
# 可以这么想,函数体是一个机器,想要加工出不同的东西,就需要塞进去不同的东西,当然也需要机器能接收不同的东西。
# 接收东西的口,就相当于形参,塞进去的东西就相当于实参,只要有了一个口,就可以塞进每个不同的东西,
# 这就类比函数可以处理不同的数据类型。塞进去的是玉米,出来的就是玉米面,塞进去的是小麦,出来的就是白面。
# 塞进去的这个过程就叫函数的传参。其实形参就是和实参形体大小差不多,性质差不多的一个可以容纳多个品类的一个位置。
#
说到传参就应该看实参和形参具体有什么了。
先从要处理的东西看,即实参角度。
一个函数体,可以一次一次的输入东西,比如说磨面机;也可以一起塞进去好多东西,比如说做冰激凌。
要想得到冰激凌,就得塞进去奶油,水,色素等,但是塞进去这么多东西不能乱塞啊,乱塞就成一锅乱粥了。
所以就得按位置一个一个传进去,第一个放奶油,第二个放水,第三个放色素,机器会按位置依次加工。
这就是实参的位置参数,实参的位置参数必须和形参一一对应,而且数量必须相同。
那么问题又来了,如果实参传进去的是一个个带标签的东西呢?
这样的话位置就不用和形参一一对应了,机器进行加工的时候会自动查看标签,按标签依次放入该放的位置。
这就是实参的关键字参数,但是数量必须和形参相等。
那如果有的有标签,有的没有标签怎么办呢?这就涉及到电脑的内部机制了,
他会先把没有标签的接收,然后再接收有标签的,如果接收完有标签的又有一个没有标签的,他就会报错。
所以,实参中如果有混合参数,就得把带标签的放后面,即关键字参数必须放后面。
这样,机器就会先让前面的一一对应放进去,再让后面的按标签进去。

从要处理的东西角度分析完了,
就应该从机器的角度分析了,即形参角度。
机器的口如何设计呢?
首先,机器的口可以简单设计一下,让口和塞进的东西一一对应,比如冰激凌机器,设计3个口,
但是位置和个数必须和实参一一对应。
还有一种情况,3个员工依次放3个东西,那如果我第三个员工旷工没来怎么办?
这就需要我设计一个自动放东西的口,第3个员工不是没来吗,我机器自动放,
默认第三个就放色素,第三个员工有没有就无所谓了。这就是默认参数,
只要对应的实参位置没有,就默认放进一个东西,如果有,就换成实参里面的东西。
但是默认参数必须放在位置参数后面,这也是电脑机制,
可以这样理解,机器造东西必须把罢工的位置放在最后,不影响前面加工。
还有一种更牛的设计,就是机器的升级版,里面可以放很多不同的东西,
依次接收完之后,先按顺序排好,然后再让机器加工,这就不用一个口对应放一个位置了,这就是动态参数*args
动态参数的口大小可以改变所以叫动态参数,可以一个口接收多个不同的东西,但是接受的东西不能带标签。
所以,动态参数接收的是实参中所有的位置参数。接收完之后先打包到一块儿,成元组形式。用的时候在按顺序依次拿出来。
那带标签的怎么办呢?同理,设计一个**kwargs,接收所有带标签的,按标签关系,打包成一个个键值对,存放到字典里。
这就是传说中的两种万能参数,可以接收实参中的任何参数。
机器有了这四种口,还得有一个接收顺序,之前说过默认参数必须在位置参数后面,这四种参数一块儿有怎么办呢?
根据形参的接收风格和实参的排序位置得知,形参设计时位置顺序是
位置参数,*args,默认参数,**kwargs。
什么意思呢?就是说你们先挨个儿,拿不了剩下的我都拿走,先让单个儿对应的放前面,再让最后的兜底。
如果让拿的多的先拿,就会把后面的拿走,后面想拿的拿不了了,就会打架,报错。


这就是我对函数大概的一个简单粗暴的了解。


猜你喜欢

转载自www.cnblogs.com/huichangkaixin/p/9026552.html
今日推荐