python 之路之函数01
一 函数
1 那么要想学习函数,我们首先应该知道函数是什么?
我们这里所说的函数与数学中的函数是不同的概念,在这里我们可以把函数看成我们写代码过程中需要用到的工具。
2 那么这个‘工具’有什么作用呢?
1, 首先会让我们的代码变的结构变得清晰,可读性强。
2 ,我们不需要再进行大量的重复代码编写,避免代码过长,导致冗余,可读性变差。
3 ,修改代码变得简单,只需要找出需要修改的地方,修改之后其他地方有重复功能的代码不需要重复的修改。
二 函数的分类
1、内置函数
为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()
2、自定义函数
很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。例如
三 函数的定义
首先定义函数有一个固定的形式:
定义函数的形式: def 函数名(参数1,参数2,参数3,...): '''注释:表达函数体的功能''' 函数体#实现函数具体功能的部分 return 返回的值 #我们在定义函数名是,要尽可能的让函数名要能反映其意义
四 函数的使用原则
先定义后使用。
我们有时候说:函数即“变量”,那么“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名,必定会报错。 #1 def foo(): print('from foo') bar() foo() #报错 在这个程序里面我们没有定义bar()这个函数,所以在使用的时候就会出现报错 #2 def bar(): print('from bar') def foo(): print('from foo') bar() foo() #正常 在这个过程中我们在使用bar()与foo()之前对他们俩都进行了定义。 #3 def foo(): print('from foo') bar() def bar(): print('from bar') foo() 同样的3也不会报错,那么这是为什么呢?因为在在函数的调用中,在定义阶段是不执行代码的,只检测程序中的语法是否正确。 #结论:函数的使用,必须遵循原则:先定义,后调用 #我们在使用函数时,一定要明确地区分定义阶段:在定义阶段只检测语法正确与否和调用阶段才会执行代码。
五 定义函数的三种形式
1 有参函数:
对于有参函数,即在调用函数段运行过程,需要用户输入输入参数的函数,定义时有参,那么就是有参函数。
def max(x,y) if x>y: return x else: return y
这段子代码在运行时就需要用户输入需要比较的两个值。
2 无参函数:
无参函数,即在调用函数程序运行过程不需要对其输入参数,定义时无参,那么就是无参函数。
x=1 y=2 def max(1,2) if x>y: return x else: return y
对于这段代码用户就不需要输入参数,应为定义时已经指定了参数。
3 空函数:
那么对于空函数来说就比较特殊了,他的作用主要是起到一个占位作用,先预留一个位置,这个地方的函数子代码为空,可以不执行任何功能,需要的时候再修改。
def func()
pass#函数的子代码为空
六 调用函数的三种形式
1 直接变量名加():
比如:len(),max()等
2 表达式的方式,因为函数的运行结果一般为一个值,所以我们可以对这个值再进行运算
比如:max(1,max(2,3))
3 将一个函数的返回值当作另一个函数的参数。
比如:len(max(x,y))
七 函数返回值
那么什么是返回值:
返回值就是函数体代码运行完毕后需要有一个结果返回给使用者,这个值就是返回值return。
1 没有return则会返回none 2 返回值后跟一个值,那么返回值就是这个值本身。 3 return后可以跟一个值也可以跟多个值,跟多个值时,用逗号分隔开,返回一个元组。
总结:1 return返回值,没有类型限制。
2 函数内可以写多个return,return是函数的结束标志位,执行第一个return后程序结束,return后面的值作为本次调用的返回值。
作业: 函数
# 1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作
# def modify(file_name,old,new ): # import os # with open(file_name,'r',encoding='utf-8')as f1: # with open('w.txt','w',encoding='utf-8')as f2: # for line in f1: # if old in line: # line.replace(old,new) # f2.write(line) # os.remove(file_name) # os.rename('w.txt',file_name) # modify('a.txt','hh','HH')
# 2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
2# # def check(msg): # res={ # 'num':0, # 'string':0, # 'space':0, # 'other':0, # } # for s in msg: # if s.isdigit(): # res['num']+=1 # elif s.isalpha(): # res['string']+=1 # elif s.isspace(): # res['space']+=1 # else : # res['other']+=1 # # return res # res=check('hdffhk123kdf;fjj,sd ') # print(res)
# 3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
3# # def chang(name): # if len(name)>5: # return 'yes' # else: # return 'no' # # res=chang((1,2,3,4,4,3)) # print(res)
#
# 4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
# def list1(list): # if len(list)>2: # return list[0:2] # else: # return list # # res=list1([1,2]) # print(res)
# 5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
5# # def func(list): # x=len(list) # return list[0:x:2] # res=func([1,2,4,3,4,6,6,4,3,3]) # print(res)
# 6、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
# dic = {"k1": "v1v1", "k2": [11,22,33,44]}
# PS:字典中的value只能是字符串或列表
def func(dic): d={} for key in dic: if len(dic[key])>2: # d=dic[key][0:2]#为什么这种方式不行呢,因为这种方式会导致d被赋值两次,第一次为v1,第二次d就变成[11,22],所以最后的返回值就是[11,22] d[key]=dic[key][0:2] return d#for循环结束之后才执行return res=func({"k1": "v1v1", "k2": [11,22,33,44]}) print(res)