python基础教程第七课函数1
hello,大家好,我是小白菜。今天为大家带来的是python基础教程的中的函数相关内容。由于函数的内容很多,因此,为了使得文章不太长,我会分几次来讲解这一大块内容。
二、正文:1.函数的引入:我们讲解字符串、列表、元组的时候,如果需要获取它们的长度,那么可以使用len函数,如下:
#1:获取字符串长度target_str=length=len(target_str)print(length)#结果为:9
那么,现在我们如果不适用len函数,如何获取长度呢?(思路:for循环)这里我直接给出我的一个解决方法:
#2:不使用len函数target_str=length=0foriintarget_str:length+=1print(length)#结果为:9
那么,问题来了,如果我有下面的数据,你如何获取它们的长度呢?
target_str1=target_str2=1target_str3=12target_str4=target_str5=4
也许你会这么做:
#2:不使用len函数target_str1=length1=0foriintarget_str1:length1+=1print(length1)target_str2=1length2=0foriintarget_str2:length2+=1print(length2)target_str3=12length3=0foriintarget_str3:length3+=1print(length3)target_str4=length4=0foriintarget_str4:length4+=1print(length4)target_str5=4length5=0foriintarget_str5:length5+=1print(length5)#结果依次为:9、10、11、12、13
与此对应的是,我们如果使用len函数呢:
target_str1=target_str2=1target_str3=12target_str4=target_str5=4print(len(target_str1))print(len(target_str2))print(len(target_str3))print(len(target_str4))print(len(target_str5))
可以看出的是,第一种方式(不使用函数)代码臃肿、冗余,第二种方式(使用函数)简洁、可读性高。
因此,使用函数是必要的。而第一种方式虽然臃肿,但是我们仍然可以获取到正确的长度,那么我们是否可以依此定义出我们自己的len函数呢?答案是可以的,如下:
#3:定义自己的len的函数defmy_len(s):length=0foriins:length+=1returnlengthtarget_str=print(my_len(target_str))#结果为:9
由此,我们引出了我们自己定义的函数my_len。
2.函数的结构:上面的讲解中,我们定义并调用了my_len函数,如下:
#3:定义自己的len的函数defmy_len(s):length=0foriins:length+=1returnlength
其中,我们可以管中窥豹,归纳出函数的定义形式:
def函数名(参数):函数体return返回值
其中:
def:关键字,语法固定形式,后接函数名字函数名:自定义函数名,需要符合变量命名要求,最好有实际意义,便于理解,比如:自己的len函数定义为:my_lenmyLen小括号:必须加上参数:参数之后会具体讲解,这里可以理解我们数学中的概念,如:f(x)=1+2*x中的x一般函数体:函数内部的代码内容return:关键字,用于返回想要返回的内容返回值:返回值可以是任何值3.函数的调用:
我们如果按照上面的内容定义了一个函数,想要调用这个函数非常简单,如下:
函数名(对应的参数)
需要注意的是:对应的参数是指的是一个实际的值,而不是之前定义的虚假的值。
比如,我定义了一个函数(名为:func),有两个参数——a和b,
deffunc(a,b):returna+b
那么,如果我想要调用这个函数,应该这么调用:
#方式一func(1,2)#参数应该写一个实际的值,或者一个具有的值的变量#方式二c,d=1,2func(c,d)#错误的调用func(a,b)#此时,a,b没有定义,也没有值4.返回值详解:
首先,一个问题:如何知道函数的返回值是什么?回答:打印即可。如下:
deffunc():returnprint(func())#结果为:
我们知道,一个函数的返回值是由return后面的东西决定的,那么如果一个函数如果不写return,那么打印的值是什么呢?
deffunc():a=1+2print(func())#结果为:None
可以看见的是,一个函数如果没有return,那么会默认返回None。因此,任何函数都有返回值。
上面的函数都是返回一个值,那么如果函数返回值是多个,那么返回的类型是什么呢?
deffunc():return[1,2,3,4],[1,2,3],,{1:}print(func(),type(func()))#结果为:([1,2,3,4],[1,2,3],,{1:})classtuple
可以看见的函数返回的是一个元组类型的值。
那么,返回值除去返回一些东西外,还有什么作用呢?看下面代码:
deffunc():print(Hello)returnprint(Bye)print(func())#结果为:Hello
上面的结果表明:该函数遇到了return后就直接结束了执行,后面的代码都不会执行。这是一个很重要的性质,用的很多。
5.参数初解:下面,我们先来简单讲解一下参数。函数的参数的作用是将一些数据传入到函数的内部,然后函数利用这些数据进行一些我们希望的处理,比如:我们想要为一个列表排序,那么需要传入待排序的列表,然后利用函数处理,最后返回排好序的列表。
而函数参数分为:形参和实参。
1形参:形参是写在函数声明位置的变量,如下:
defsayHello(name):print(hello,name)
上面的sayHello函数中的参数name即是形参,是一种形式的参数,在没有具体调用函数之前是没有值的。
2实参:实参就是函数在调用的时候传给形参的变量,如下:
defsayHello(name):print(hello,name)target_name=baicaisayHello(target_name)
上面的代码中,函数调用sayHello(target_name)中的target_name就是实参,是真实具有一定值的变量。
3传值or传址:如果大家学过c语言,一定会疑问:python中的参数传递是传值还是传址?
首先,看下面的代码:
defadd(a):print(id(a))a+=2print(id(a))a+=2print(id(a))a+=2print(id(a))b=1print(id(b))add(b)
上面运行的结果是:
#原始打印#没有改变值之前的打印#修改之后的打印144208
可以看见的是,当我们函数内部没有修改值之前,id地址是相同的,相当于传址,但是一旦修改了变量值,id就变换了,相当于python又开辟一块内存来存储变换之后的变量值。
再看下面的代码:
defadd(a):print(id(a))a.append(1)print(id(a))b=[1,2,3]print(id(b))add(b)
结果如下:
000
可以看见的是,当我们的传入的值是列表这样的可变类型的值的时候,即使修改python也不会开辟一块空间来存储值。
综上,我们可以得出一定的结论:
python传参不是简单的传值or传址如果参数不可变,那么一旦修改就会开辟新的空间存储如果参数可变,那么即使修改也不会开辟新的空间存储4实参的分类:位置参数:
位置参数就是从左至右,一一与形参对应,如下:
defintroduce(name,age,where):print(mynameis%s,iam%sandi
转载请注明:http://www.sonphie.com/jibzd/14402.html