Fork me on GitHub

python 之路之函数01

一   函数

那么要想学习函数,我们首先应该知道函数是什么?

我们这里所说的函数与数学中的函数是不同的概念,在这里我们可以把函数看成我们写代码过程中需要用到的工具。

那么这个‘工具’有什么作用呢?

     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,2if 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')
View Code

# 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)
View Code

# 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)
View Code
#
# 4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
# def list1(list):
#     if len(list)>2:
#         return list[0:2]
#     else:
#         return list
#
# res=list1([1,2])
# print(res)
View Code

# 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)
View Code

# 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就变成[1122],所以最后的返回值就是[1122]
          d[key]=dic[key][0:2]
    return d#for循环结束之后才执行return

res=func({"k1": "v1v1", "k2": [11,22,33,44]})
print(res)
View Code

 

posted @ 2018-03-26 15:41  道阻切长  阅读(140)  评论(0编辑  收藏  举报