初识函数

本篇内容

1.什么是函数

2.函数定义,函数名,函数体以及函数的调用

3.函数的返回值

4.函数的参数

5.练习题

 

 

一.什么是函数

函数:定义一个事情或功能.等到需要的时候直接去用就好了.(对代码块和功能的封装和定义)

 

二..函数定义,函数名,函数体以及函数的调用

1...函数定义,函数名,函数体

def 函数名():
    函数体
定义函数语法

函数名的命名规则和变量名的命名规则是一样的

1.由字母数字下划线组成
2.不能由数字开头
3.不能是python关键字
4.要有意义,不能太长
5.区分大小写
6.不要用中文
函数名的命名规则

2.函数的调用,注意:函数只有被调用的时候里面的代码才会被执行,不调用的话就是定义了一个函数而已

使用函数名可以调用函数,写法:函数名(),这个时候函数就会被执行

def func():
    print('哈哈')
func()
函数调用

 

三.函数的返回

执行完函数之后,我们可以使用return来返回结果

(1)函数终于到return,此函数结束,不再执行

def func():
    print('哈哈')
    return
    print('呵呵')
func()
return
哈哈
结果

 

 (2)给函数的调用者一个返回结果

a=0
def func():
    return a
ret=func()
print(ret)


#0
返回值

(3)函数的返回值可以有多个结果注意:多个返回值放在一个元组里

def func():
    a=10
    b=20
    c='嘻嘻'
    return a,b,c
ret=func()
print(ret)
print(type(ret))


#(10, 20, '嘻嘻')
#<class 'tuple'>
多个返回值

总结:

1.遇到return,此函数就结束,函数后面的东西将不会在执行

2.return返回值

(1)如果什么都不写或者return后面什么都不写就返回None

(2)如果return后面写了一个值,则掉用者可以接受一个结果

(3)如果后面写了多个结果,则调用者可以接受一个tuple,可以结构获取多个变量

 

四.函数的参数

参数函数在调用的时候指定具体的一个变量的值,就是参数,语法:

def 函数名(参数列表):         #形参
    函数体
函数名(实参)
def func(food):
    print('我今天中午吃了%s'%(food))
func('面条')
func('炒面')
func('盖浇饭')


结果:
# 我今天中午吃了面条
# 我今天中午吃了炒面
# 我今天中午吃了盖浇饭
参数

  1.形参

写在函数声明的位置变量叫做形参,表示这个函数需要xxx

  2.实参

在调用函数的时候给函数传递的值叫做实参,表示给函数xxx

  3.传参

给函数传递信息的时候将实际参数交给形式参数的过程被称为传参'

  4.参数的分类

  4.1实参的分类

4.1.1位置参数(将实参按位置传给形参变量)

def yue(time,ad,gender,name):
    print('%s在%s与某%s叫%s'%(time,ad,gender,name))
    #今天在餐厅与某女叫lucy
    # print(time+'在'+ad+'与某'+gender+'叫'+name)
    #今天在餐厅与某女叫lucy
    # print(name + '在' + ad + '与某' + gender + '叫' + time)
    #lucy在餐厅与某女叫今天
yue('今天','餐厅','','lucy')
位置参数
def func(a,b):
    return a if a>b else b
print(func(10,20))



#20
编写函数,比较a,b的大小

4.1.2关键字参数

def name(a,b):
    print('我叫'+a+'我喜欢'+b+'再说一遍我叫'+a)
ret=name(a='吃饭',b='睡觉')
print(ret)
#我叫吃饭我喜欢睡觉再说一遍我叫吃饭
关键字

4.1.3混合参数(位置参数必须在关键字参数前面)

def name(a,b,c,d):
    print('我叫%s我喜欢%s还喜欢%s再说一遍我叫%s'%(a,b,c,d))
ret=name('锅包肉','鱼香肉丝',c='吃饭',d='睡觉')
#我叫锅包肉我喜欢鱼香肉丝还喜欢吃饭再说一遍我叫睡觉
混合参数

  4.2形参的分类

4.2.1位置参数按照位置来赋值到目前为止,我们编的都是这种

4.2.2默认值参数(在调用的时候如果给值,就用给的值,如果不给就默认值,声明位置参数,必须在默认值参数前面

def name(name,gender,age=8):
    print(name,gender,age)
name('哈哈','')
name('吼吼','',age=9)

# 哈哈 女 8
# 吼吼 女 9
默认参数

4.2.3动态参数

4.2.3.1动态接收位置参数(接受的是一个元组     无关('a',)只有一个元素的元组,需要逗号)

def func(*argc):
    print('我要吃',*argc)
func('锅包肉','烤冷面','炒饼')

#我要吃 锅包肉 烤冷面 炒饼
动态参数接收位置参数

 声明位置参数必须在动态参数前面

def func(*argc,a,b,):
    print('我要吃',a,b,*argc)
func('锅包肉','烤冷面','炒饼','kaixin')
    
# TypeError: func() missing 2 required keyword-only arguments: 'a' and 'b'
错误示范

 改正:

def func(*argc,a,b,):
    print('我要吃',a,b,argc)
func('锅包肉','烤冷面',a='炒饼',b='kaixin') #用关键字参数来指定
#我要吃 炒饼 kaixin ('锅包肉', '烤冷面')
def func(a,b,*argc):
    print('我要吃',a,b,argc)
func('锅包肉','烤冷面','炒饼','kaixin')

#我要吃 炒饼 kaixin ('锅包肉', '烤冷面')
#(如果动态参数在前面,会接受所有的位置参数,会报错)
def func(*argc,a,b,):
    print('我要吃',a,b,*argc)
func('锅包肉','烤冷面',a='炒饼',b='kaixin') #用关键字参数来指定
#我要吃 炒饼 kaixin 锅包肉 烤冷面
print(*动态参数直接打散)

探究默认参数位置

def func(a,b,c='西瓜',*argc):
    print('我要吃',a,b,c,argc)
func('锅包肉','烤冷面','炒饼','')
func('锅包肉','烤冷面','炒饼','','橘子')
func('锅包肉','烤冷面')
# 我要吃 锅包肉 烤冷面 炒饼 ('桃',)           #默认参数没生效
# 我要吃 锅包肉 烤冷面 炒饼 ('桃', '橘子')   #默认参数没生效
# 我要吃 锅包肉 烤冷面 西瓜 ()                  #默认参数生效
默认参数位置
def func(a,b,*argc,c='西瓜'):
    print('我要吃',a,b,c,argc)
func('锅包肉','烤冷面','炒饼','')
func('锅包肉','烤冷面','炒饼','','橘子')
func('锅包肉','烤冷面')
# 我要吃 锅包肉 烤冷面 西瓜 ('炒饼', '桃')
# # 我要吃 锅包肉 烤冷面 西瓜 ('炒饼', '桃', '橘子')
# 我要吃 锅包肉 烤冷面 西瓜 ()
默认值都生效
def func(a,b,*argc,c='西瓜'):
    print('我要吃',a,b,c,argc)
func('锅包肉','烤冷面','炒饼',c='')
func('锅包肉','烤冷面','炒饼','',c='橘子')
func('锅包肉','烤冷面')
# 我要吃 锅包肉 烤冷面 桃 ('炒饼',)
# 我要吃 锅包肉 烤冷面 橘子 ('炒饼', '桃')
# 我要吃 锅包肉 烤冷面 西瓜 ()
通过关键字传参可以修改默认值

 

顺序:位置参数    动态参数 (*argc)    默认参数

4.3.2.2动态接收关键字参数**来接收键字参数这时候接收的是一个字典

def func(**argc):
    print(argc)
func(a=1,b=2,c=3)


#{'a': 1, 'b': 2, 'c': 3}
动态参数接受关键字参数

因为实参位置参数必须放关键字参数前面,所以形参接受的时候也是这个顺序

最终顺序:位置参数    *argc   默认参数    **kwargc

如果想接受所有参数 :

def func(*args,**kwargs):
    print(args,kwargs)
func('hello','world',c='减肥',d='加油')


#('hello', 'world') {'c': '减肥', 'd': '加油'}
View Code

4.4实参位置上*  **

在实参位置上给一个序列,列表,可迭代对象前面加一个*表示把这个序列按顺序打散,在形参位置上的*表示把接收到的参数组合成一个元组

 

五.练习题

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

def func(lis):
    return lis[1::2]      
print(func(['刘晓蕾','hahah']))


#['hahah']
方法一
def func(lis):
    li=[]                 
    for i in range(len(lis)):
        if i%2!=0:
            li.append(lis[i])
    return li
print(func(['刘晓蕾','hahah']))



#['hahah']
方法二

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

def func(s):
    return len(s)>5
s="sdnjhfuhf"
print(func(s))


#如果大于五就True
View Code

3.写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用

s=['刘晓蕾','哈哈哈','你好']
a=lambda *args:args[:2]
print(a(*['刘晓蕾','哈哈哈','你好','HFGYFG']))
#打散成为位置参数,得到的是长度为4的一个元组,
# 如果不打散得到的就是一个长度为1,里面是这个列表的元组




#('刘晓蕾', '哈哈哈')
方法一
def long(lis):
        return lis[0:2]
ret=long(['','刘晓蕾','刘晓寒'])
print(ret)




#['哈', '刘晓蕾']
方法二

4.,写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果。

def count(s):
    number=0
    english=0
    write=0
    d=0
    for i in s:
        if i.isdigit():
            number=number+1
        elif i.isalpha():
            english=english+1
        elif i==' ':
            write=write+1
        else:
            d=d+1
    return(number,english,write,d)
print(count('fjdkfhfhipcp 4578   &'))
View Code

5.写函数,接收两个数字参数,返回比较大的那个数字。

a=lambda a,b:a if a>b else b
print(a(1,2))
方法一法二练习里有

6.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。PS:字典中的value只能是字符串或列表

def func(dic):
    for i in dic:
        if len(dic[i]) > 2:
            dic[i] = dic[i][0:2]
    return dic
dic = {"k1": "v1v1", "k2": [11,22,33,44],'k3':"nihao"}
print(func(dic))
方法一
dic = {"k1": "v1v1", "k2": [11,22,33,44],'k3':"nihao}
lis=[dic[i][:2] for i in dic]
print(lis)




#['v1', [11, 22], 'ni']
法二
ll=filter(lambda i:len(dic[i])>2,dic)
for i in ll:
    print(dic[i][:2])


结果:
#v1
#[11, 22]
#ni
法三filter

7.写函数,此函数只接收一个参数且此参数必须是列表数据类型, 此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。 例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。

def func(lis):
    if type(lis)==list:
        dic={}
        for i in range(len(lis)):
            dic[i]=lis[i]
        return dic
print(func([11,22,33]))
函数法
lis=[11,22,33]
a={lis.index(i):i for i in lis}
print(a)

#{0: 11, 1: 22, 2: 33}
字典解析式法

8.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。 # 用户通过输入这四个内容,然后将这四个内容传入到函数中,此函数接收到这四个内容, # 将内容追加到一个student_msg文件中。

def func(name,age,gender,edu):
    with open('student_msg',mode='a+',encoding='utf-8')as f:
        f.write(name+' '+str(age)+' '+gender+' '+edu+'\n')
func(name='刘晓蕾',age=20,gender='',edu='本科')




#刘晓蕾 20 女 本科
View Code

9.对第8题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女。

def func(name,age,edu,gender=''):
    with open('student_msg',mode='a+',encoding='utf-8')as f:
        f.write(name+' '+str(age)+' '+gender+' '+edu+'\n')
while 1:
    concent=input('是否继续录入学生信息')
    if concent=='':
        break
    else:
        name=input('请输入你的姓名')
        age=input('请输入你的年龄')
        gender=input('请输入你的性别')
        edu=input('请输入你的学历')
        if gender=='':
            func(name,age,edu)
        else:
            func(name,age,edu,gender)

#刘晓蕾 20 女 本
#刘晓 20 男 哈哈
View Code

10.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。(w模式下只会有第一次写的时候会清空原来的,在写就不会了)

def func(filename,old,new):
    import os
    with open(filename,mode='r',encoding='utf-8') as f1,\
         open(filename+'副本',mode='w',encoding='utf-8') as f2:
        for line in f1:
            if old in line:
                line=line.replace(old,new)
            f2.write(line)
    os.remove(filename)
    os.rename(filename+'副本',filename)
func('呵呵','嘿嘿','哈哈')
View Code

 

posted @ 2018-08-19 11:45  2275114213  阅读(187)  评论(0编辑  收藏  举报