python3--函数初识

发布时间:2018-03-29 15:46:29编辑:Run阅读(3900)

    比如python没有len()方法,如何求字符串长度,使用for循环

    s = 'dadhhrqlasd'
    count = 0
    for i in s:
        count += 1
    print(count)

    执行输出

    11


    求列表呢?

    l1 = [1, 2, 3, 4, 5, 'a', 'b', 'c', 'abc', 10]
    count = 0
    for j in l1:
        count += 1
    print(count)

    执行结果

    10


    通过上面两个例子,可以看出方法都是使用的同一个,但是重复代码多,可读性差

    写代码

    函数的产生:

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.

    函数能提高应用的模块性,和代码的重复利用率。已经知道python提高了许多内建函数,比如print(),len()等。但你也可以自己创建函数,这被叫做用户自定义函数。

    l1 = [1, 2, 3, 4, 5, 'a', 'b', 'c', 'abc', 10]
    def my_len():
        # def关键字 定义一个函数
        # my_len函数名的书写规则与变量一样
        # def与函数名中间有一个空格(规定)
        # 函数名():加上冒号(将函数名与函数体隔开)
        # 函数体,就是函数里面的逻辑代码
        count = 0
        for j in l1:
            count += 1
        print(count)
    # 执行函数
    my_len()

    输出结果

    10


    代码是从上向下执行的,在执行my_len()时,将my_len加载到内存中,中间逻辑不读,将代码打包一下,放到临时内存中,它不执行


    函数的返回值

    用len()方法时,得到的结果会赋值给一个变量,然后得到结果

    print(len('hello,world'))

    结果为: 11

    但是之前写的函数,并不会得到这样的结果,如何让它和len函数一样,有返回值呢?

    那就是在函数的最后加上一个return, return后面写你需要的返回值就可以了

    例子

    def my_len():
        """计算s1的长度"""
        s1 = 'hello world'
        count = 0
        for i in s1:
            count += 1
        return count
    # 函数调用
    print(my_len())

    结果为11


    下面研究下return关键字的作用

    return关键字的作用

    return是一个关键字,在pycharm里,你会看到它变成蓝色

    这个词翻译过来就是返回的意思,所以我们写在return后面的值叫"返回值",要研究返回值,返回值有几种情况:分别是没有返回值,返回一个值,返回多个值


    没有返回值

    不写return的情况下,会默认返回一个None:

    例子

    def my_len():
        """计算s1的长度"""
        s1 = 'hello world'
        count = 0
        for i in s1:
            count += 1
        print(count)
    # 函数调用
    str_len = my_len()
    # 因为没有返回值,此时的str_len为None
    print(str_len)

    只写return,后面不写其它内容,也会返回None,既然没有要返回的值,完全可以不写return,为什么还要写个return呢?,这就是return的其它用法,就是一旦遇到return,结束整个函数

    例子

    def tmp_demo():
        print(111)
        return
        print(222)
    res = tmp_demo()
    print(res)

    结果为

    111

    None

    return None:返回了一个None和上面的例子一样,只打印了前面的111,说明后面的222没有被执行


    返回一个值

    只需要在return后面写上要返回的内容即可

    例子

    # 函数定义
    def my_len():
        """计算s1的长度"""
        s1 = 'hello world'
        count = 0
        for i in s1:
            count += 1
        return count
    # 函数调用
    print(my_len())

    结果为:11


    返回多个值,将多个值放到一个元组里,返回给函数的调用者

    例子

    def tmp_demo2():
        '''返回多个值'''
        return 1,['a','b'],2,3,4
    print(tmp_demo2())

    输出结果

    (1, ['a', 'b'], 2, 3, 4)


    函数的传参

    def my_len(l): # l形式参数,形参
        count = 0
        for i in l:
            count += 1
        return count
    a = 'abcdefg'
    print(my_len(a)) #括号里面的a是实际参数,实参

    执行输出

    7


    函数的传参

    两方面:

        实参角度:

            1.位置传参 按顺序,一一对应。

    例子

    def func(a,b,c):
        print(a)
        print(b)
        print(c)
    func(2,3,4)

    输出结果

    2,3,4


    实例:写一个函数,功能比大小,大的返回

    def max_min(a, b):
        if int(a) > int(b):
            return a
        else:
            return b
    print(max_min(1, 3))

    执行结果

    3


    三元运算

    简单的if和else判断,就可以用三元运算

    上面函数的简写

    def max_min(a,b):
        z = a if a > b else b
        return z
    print(max_min(10,2))
    # 进一步简写
    def max_min(a, b):
        return a if a > b else b
    print(max_min(10,20))


    2 关键字传参,不安顺序,一一对应

    比如:

    def max_min(a,b):
        return a if a > b else b
    print(max_min(b=10, a=20))

    执行结果

    20


    错误的示例

    def func1(a,b,c,d,e):
        print(a)
        print(b)
        print(c)
        print(d)
        print(e)
    func1(1,2,c=3,4,5)

    执行报错

    blob.png

    注意:位置参数,永远在位置参数的后面

    即改成

    def func1(a,b,c,d,e):
        print(a)
        print(b)
        print(c)
        print(d)
        print(e)
    func1(1,2,c=3,d=4,e=5) #或者 func1(1,2,3,4,e=5)


    3 混合参数,关键字参数永远在最后面


    实参角度:

            1,位置传参。按顺序,一一对应

            2,关键字传参,不按顺序,一一对应

            3,混合传参,关键字参数永远在位置参数的后面


    按照形参角度

    1,位置传参,按顺序,一一对应

    例子

    def func(a,b,c):
        print(a)
        print(b)
        print(c)
    func('abc',3,4)

    执行结果

    abc

    3

    4


    2. 默认参数

    def func(a, b=666):
        print(a,b)
    func(1,2)

    执行结果

    1 2


    def func(a, b=666):
        print(a,b)
    func(1)

    执行结果

    1 666

    形参角度:

            1.位置传参,按顺序,一一对应

            2.默认参数,传参则覆盖,不传则默认


    实例,录入员工信息表,使用函数封装

    def infor_entry(username,sex='男'):
        with open('name_list', encoding='utf-8', mode='a') as f:
            f.write('{}\t{}\n'.format(username,sex))
    
    while True:
        username = input("请输入姓名(男生以1开头)").strip()
        if '1' in username:
            username = username[1:]
            infor_entry(username)
        else:
            infor_entry(username,'女')

    执行后的name_list结果为

    blob.png


    下面看个例子

    错误示例

    def func(b=666,a):
        print(a,b)
    func(1,2)

    执行报错

    blob.png

    默认参数必须在位置参数的后面

    形参角度:

            1,位置传参。按顺序,一一对应

            2,默认参数。传参则覆盖,不传则默认,默认参数永远在位置参数后面


    本章节练习题

    #!/usr/bin/env python
    # coding: utf-8
    __author__ = 'www.py3study.com'
    # 2、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
    # 方法1
    # def func(l):
    #     new_list = []
    #     for i in range(len(l)):
    #         if i % 2 == 1:
    #             new_list.append(l[i])
    #     return new_list
    # print(func((1,2,3,4,5,6,7,8,9)))
    # 方法2
    # def func(l):
    #     l = l[1::2]
    #     return l
    # print(func((1,2,3,4,5,6,7,8,9)))
    #方法3
    # def func1(argv):return argv[1::2]
    # print(func1((1,2,3,4,5,6,7,8,9)))
    
    
    # 3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    # 方法一
    # def func(l):
    #     if len(l) > 5:
    #         return True
    #     else:
    #         return False
    # print(func('abcdef'))
    # 方法二
    # 因为它是一个不等式,结果不是True就是False,所以可以用三元运算
    # def func(l):
    #     return True if len(l) > 5 else False
    # print(func('abcdef'))
    
    # 4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
    # 方法1
    # def func(l):
    #     if len(l) > 2:
    #         l = l[:2]
    #     else:
    #         l = l
    #     return l
    # print(func([1,2,3,4]))
    # 方法2
    # def func(l):
    #     return l[:2] if len(l) > 2 else l
    # print(func([1,2,3,4]))
    # 方法3,即使小于2,也可以切片,返回原来的值,切片不会报错
    # def func(argv):
    #     return argv[:2]
    # print(func([1,2,3,4]))
    
    # 5、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数,并返回结果。
    # def func(argv):
    #     dic = {'digit':0,'alpha':0,'space':0,'other':0}
    #     for i in argv:
    #         #判断是否为数字
    #         if i.isdigit():
    #             dic['digit'] += 1
    #         #判断是否为字母
    #         elif i.isalpha():
    #             dic['alpha'] += 1
    #         #判断是否为空格
    #         elif i.isspace():
    #             dic['space'] += 1
    #         else:
    #             dic['other'] += 1
    #     return '数字{},字母{},空格{},其它{}'.format(dic['digit'],dic['alpha'],dic['space'],dic['other'])
    # print(func('sfsf 1231 fyi324#@%#%@! fd12'))
    
    
    # 7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
    #  dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    #  PS:字典中的value只能是字符串或列表
    # 方法一
    # dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    # print(len(dic))
    # def fun(dic):
    #     for x,y in dic.items():
    #         if len(y) > 2:
    #             y = y[:2]
    #             dic[x] = y
    #     return dic
    # print(fun(dic))
    # 方法二
    # def fun(dic):
    #     for i in dic:
    #         if len(dic[i]) > 2:
    #             dic[i] = dic[i][:2]
    #     return dic
    # print(fun(dic = {"k1": "v1v1", "k2": [11,22,33,44]}))
    # 方法3,代码优化
    # def fun(dic):
    #     for i in dic:
    #         dic[i] = dic[i][:2]
    #     return dic
    # print(fun(dic = {"k1": "v1v1", "k2": [11,22,33,44]}))
    
    
    # 8、写函数,接收两个数字参数,返回比较大的那个数字。
    # def fun1(x,y):
    #     return x if x > y else y
    # print(fun1(5,10))
    
    # 9、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(进阶)。
    # import os
    # def fun1(x,y,z):
    #     with open(x,encoding='utf-8',mode='r') as f1,\
    #         open('x.bak',encoding='utf-8',mode='w') as f2:
    #         for i in f1:
    #             new_i = i.replace(y,z)
    #             f2.write(new_i)
    #     os.remove(x)
    #     os.rename('x.bak', x)
    # fun1('zuoye7.txt','zhangsan','lisi')
    
    
    # 10、写一个函数完成三次登陆功能,再写一个函数完成注册功能(进阶)
    
    # class Login(object):
    #     def __init__(self):
    #         print("欢迎访问!首次登陆,请注册一个账号!")
    #         self.name_and_pwd = []
    #         self.account_registration()
    #     def account_registration(self):
    #         while True:
    #             self.username = input('请输入账户名:').strip()
    #             if self.username.isdigit():
    #                 print("账号不能为纯数字")
    #             else:
    #                 self.name_and_pwd.append(self.username)
    #                 self.password = input("请输入密码:").strip()
    #                 self.again_password = input("再次输入密码确认:").strip()
    #                 if self.password == self.again_password:
    #                     print("账号注册成功")
    #                     self.name_and_pwd.append(self.again_password)
    #                     self.sign_in()
    #                 else:
    #                     print("两次输入的密码不一致!")
    #     def sign_in(self):
    #         max = 3
    #         count = 0
    #         while count < max:
    #             count += 1
    #             username = input("账号:").strip()
    #             if username == self.name_and_pwd[0]:
    #                 password = input("密码:").strip()
    #                 if password == self.name_and_pwd[1]:
    #                     print("登陆成功!")
    #                     exit()
    #                 else:
    #                     print("密码不存在")
    #             else:
    #                 print('账号不存在!')
    #                 print('剩余{}次机会'.format(max-count))
    #             if max - count == 0:
    #                 exit()
    #
    # if __name__ == '__main__':
    #     st = Login()



关键字

上一篇: python3--文件操作

下一篇: python3--函数进阶