第三章 Python函数

函数

  如果在开发程序时,需要某块代码多次,但是为了提⾼编写的效率以及代码的重⽤,所以把具有独⽴功能的代码块组织为⼀个⼩模块,这就是函数

函数的定义

  函数定义的三种方式:无参函数,有参函数,空函数

#无参函数
def demo_print():
    print('hello')

#有参函数
def add(x,y):
    print(x+y)

#空函数
def foo(x,y):
    pass

函数调用

  调⽤函数很简单的,通过函数名() 即可完成调⽤:demo_print()

  函数使用的原则是:先定义,再调用

函数的注释

def demo_ano():
    '''
  注释
    '''
    print('-------')

  使用help(demo_ano)可以看到函数的相关说明

函数参数

  形参与实参:形参即变量名,实参即变量值,函数调用时将实参赋值给形参 

def add(a,b):
     s=a+b
    return s

add(1,2)
#(a,b)为形参,(1,2)为实参

  位置参数:按照从左到右的顺序定义的参数

def add(num1,num2):
    s=num1+num2
    return s

add(5,6)

(num1,num2)为位置形参,(5,6)为位置实参

  关键字参数:按照key=value的形式定义的参数

def login(name,pwd):
    if name=='luoli' and pwd=='123456':
        print('Login Sucess')
    else:
        print('Login failed')

login(pwd='123456',name='luoli')

  默认参数:形参在定义时就已经为其赋值

def add(a,b=3):
    s=a+b
    print(s)

add(3)
add(5,10)

默认参数只在定义时赋值一次,可以传值,也可以不传值,默认参数的定义应该在位置参数的右边,默认参数通常定义成不可变类型

  可变长参数:可变长指的是实参值得个数不固定,实参位置实参和关键字实参两种,针对这两种形式的可变长参数,形参有对应的两种方式来存放它们,即*args和**kwargs

  *args

def foo(x,y,*args):
    print(x,y)
    print(args)

foo(1,2,3,4,5)

def foo(x,y,z):
    print(x,y,z)

foo(*[1,2,3])

  **kwargs:必须按照key=value的方式赋值

def foo(x,y,**kwargs):
    print(x,y)
    print(kwargs)

foo(1,2,z=3,p=4,q=5)

def foo(x,y,**kwargs):
    print(x,y)
    print(kwargs)

foo(**{'z':1,'x':2,'y':4})

  *args,**kwargs:对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的

  命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递

def foo(x,y,*args,a=1,b,**kwargs):
    print(x,y)
    print(args)
    print(a)
    print(b)
    print(kwargs)

foo(1,2,3,4,5,b=3,c=4,d=5)

函数返回值

  所谓“返回值”,就是函数中程序完成后,最后给调⽤者返回的结果,如果想要使用这个结果,那么就需要保存该返回值

def add(a,b):
    return a+b

res=add(1,2)
print(res)

函数类型

  无参数,无返回值

def demo_print():
    print('test')

demo_print()

  无参数,有返回值

import time
def get_time():
    current_time=time.time()
    return current_time

res=get_time()
print(res)

  有参数,无返回值

  此类函数,能接收参数,但不可以返回数据,⼀般情况下,对某些变量设置数据⽽不需结果时,⽤此类函数

  有参数,有返回值

def add(a,b):
    return a+b

res=add(100,200)
print(res)

练习

  (1)写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批量修改操作

def modify_file(source_file,old,new):
    import os
    with open(source_file,'r',encoding='utf-8') as read_f,\
        open('.bak.swap','w',encoding='utf-8') as write_f:
        for line in read_f:
            if old in line:
                line=line.replace(old,new)
            write_f.write(line)
    os.remove(source_file)
    os.rename('.bak.swap',source_file)
View Code

  (2)写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数

def count(charac):
    d={
        'num':0,
        'str':0,
       'space':0,
        'others':0,
    }
    for i in charac:
        if i.isdigit():
            d['num']+=1
        elif i.isalpha():
            d['str']+=1
        elif i.isspace():
            d['space']+= 1
        else:
            d['others']+=1
    return d
#res=count('hello123 hh ****')
#print(res)
View Code

  (3)写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5

def my_len(model):
    i=len(model)
    if i > 5:
        print('%s长度大于5'%model)
    else:
        print('%s长度小于5'%model)

# my_len([1,2,3,4,5,6])
# my_len('sdf')
View Code

  (4)写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者

def li_len(li):
    if len(li)>2:
        li=li[0:2]
    return li

res=li_len([1,2,3,4])
print(res)
View Code

  (5)写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者

def mod_odd(mod):
    mod=mod[::2]
    return mod

res=mod_odd([1,2,3,4,5])
print(res)
View Code

  (6)写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者

def di_len(di):
    for k,v in di.items():
        if len(v) > 2:
            di[k]=v[0:2]
    return di

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

 

posted @ 2017-12-22 10:29  日新其德止于至善  阅读(293)  评论(0编辑  收藏  举报