zoukankan      html  css  js  c++  java
  • python — 函数基础知识(一)

    1 面向过程编程与函数式编程

    截至目前我们所接触、所写的编程为:面向过程式编程【可读性差/可重用性差】

    # 面向过程编程
    user_input = input('请输入角色:')
    
    if user_input == '管理员':
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        msg = MIMEText('管理员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
        msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
        msg['To'] = formataddr(["管理员", '344522251@qq.com'])
        msg['Subject'] = "情爱的导演"
    
        server = smtplib.SMTP("smtp.163.com", 25)
        server.login("15776556369@163.com", "qq1105400511")
        server.sendmail('15776556369@163.com', ['管理员', ], msg.as_string())
        server.quit()
    elif user_input == '业务员':
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        msg = MIMEText('业务员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
        msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
        msg['To'] = formataddr(["业务员", '业务员'])
        msg['Subject'] = "情爱的导演"
    
        server = smtplib.SMTP("smtp.163.com", 25)
        server.login("15776556369@163.com", "qq1105400511")
        server.sendmail('15776556369@163.com', ['业务员', ], msg.as_string())
        server.quit()
    elif user_input == '老板':
        import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
        msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
        msg['To'] = formataddr(["老板", '老板邮箱'])
        msg['Subject'] = "情爱的导演"
    
        server = smtplib.SMTP("smtp.163.com", 25)
        server.login("15776556369@163.com", "qq1105400511")
        server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string())
        server.quit()
    
    # 函数式编程
    def send_email():
    	import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
        msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
        msg['To'] = formataddr(["老板", '老板邮箱'])
        msg['Subject'] = "情爱的导演"
    
        server = smtplib.SMTP("smtp.163.com", 25)
        server.login("15776556369@163.com", "qq1105400511")
        server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string())
        server.quit()
    
    
    user_input = input('请输入角色:')
    
    if user_input == '管理员':
        send_email()
    elif user_input == '业务员':
        send_email()
    elif user_input == '老板':
        send_email()
    

    对于函数编程:

    • 本质:将N行代码拿到别处并给他起个名字,以后通过名字就可以找到这段代码并执行。
    • 场景:
      • 代码重复执行
      • 代码特别多超过一屏,可以选择通过函数进行代码的分割

    2 函数的基本结构

    # 函数的定义
    def 函数名():   # 函数名的命名规范、建议与变量的一样
        # 函数内容 (缩进)
        pass
    
    # 函数的执行
    函数名()
    
    def get_list_first_data():
        v = [11,22,33,44]
        print(v[0])
    
    get_list_first_data()
    
    # 注意:函数如果不被调用,则内部代码永远不会被执行。
    
    # 假如:管理员/业务员/老板用的是同一个邮箱。
    def send_email():
    	print('发送邮件成功,假设有10含代码')
    
    
    user_input = input('请输入角色:')
    
    if user_input == '管理员':
        send_email()
    elif user_input == '业务员':
        send_email()
    elif user_input == '老板':
        send_email()
    

    总结:

    # 情况1
    def f1():
        pass 
    f1()
    
    # 情况2
    def f2(a1):
        pass 
    f2(123)
    
    # 情况3
    def f3():
        return 1 
    v1 = f3()
    
    # 情况4
    def f4(a1,a2):
        # ... 
        return 999
    v2 = f4(1,7)
    
    def show(name,age):
        """
        函数是干什么的...    # 必须注明函数
        :param name: 
        :param age: 
        :return: 
        """
        return None
    

    函数内部的数据是否会混乱:(函数与函数之间的执行互不影响)

    • 1.函数执行完毕
    • 2.内部元素不被其他人使用 ---->销毁函数执行的内存数

    3 函数的参数

    def get_list_first_data(aaa): # aaa叫形式参数(形参)
        v = [11,22,33,44]
        print(v[aaa])
        
    get_list_first_data(1) # 2/2/1调用函数时传递叫:实际参数(实参)
    get_list_first_data(2)
    get_list_first_data(3)
    get_list_first_data(0)
    

    严格按照顺序传参数:位置方式传参

    实际参数可以是任意类型

    # 假如:管理员/业务员/老板用的是同一个邮箱。
    """
    def send_email(to):
    	import smtplib
        from email.mime.text import MIMEText
        from email.utils import formataddr
    
        msg = MIMEText('导演,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
        msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
        msg['To'] = formataddr(["导演", to])
        msg['Subject'] = "情爱的导演"
    
        server = smtplib.SMTP("smtp.163.com", 25)
        server.login("15776556369@163.com", "qq1105400511")
        server.sendmail('15776556369@163.com', [to, ], msg.as_string())
        server.quit()
    """
    def send_email(to):
        template = "要给%s发送邮件" %(to,)
        print(template)
     
    
    user_input = input('请输入角色:')
    
    if user_input == '管理员':
        send_email('xxxx@qq.com')
    elif user_input == '业务员':
        send_email('xxxxo@qq.com')
    elif user_input == '老板':
        send_email('xoxox@qq.com')
    

    练习题

    # 1. 请写一个函数,函数计算列表 info = [11,22,33,44,55] 中所有元素的和。
    
    def get_sum():
        info = [11,22,33,44,55]
        data = 0
        for item in info:
            data += item
        print(data)
    
    get_sum()
    
    # 2. 请写一个函数,函数计算列表中所有元素的和。
    
    def get_list_sum(a1):
       	data = 0
        for item in a1:
            data += item
       	print(data)
        
    get_list_sum([11,22,33])
    get_list_sum([99,77,66])
    v1 = [8712,123,123]
    get_list_sum(v1)
    
    # 3. 请写一个函数,函数将两个列表拼接起来。
    def join_list(a1,a2):
        result = []
        result.extend(a1)
        result.extend(a2)
        print(result)
        
    join_list([11,22,33],[55,66,77]
    
    # 4. 计算一个列表的长度
    def my_len(arg):
    	count = 0
    	for item in arg:
              count += 1
    	print(count)
    
    v = [11,22,33]
    my_len(v)
    len(v)
    
    # 5. 发邮件的示例
              
    def send_email(role,to):
        template = "要给%s%s发送邮件" %(role,to,)
        print(template)
     
    
    user_input = input('请输入角色:')
    
    if user_input == '管理员':
        send_email('管理员','xxxx@qq.com')
    elif user_input == '业务员':
        send_email('业务员','xxxxo@qq.com')
    elif user_input == '老板':
        send_email('老板','xoxox@qq.com')
    
    

    3.1 形参

    3.1.1 基本参数知识
    • 参数可以是任意个数

    • 可以是任意类型

      def func(a1,a2,a3,a4):
      	print(a1,a2,a3,a4)
      	
      func(2,'name',[1,2,3],False)
      
    3.1.2默认参数
    def func(a1,a2,a3=9,a4=10):   # 默认参数a3=9,a4=10
        print(a1,a2,a3,a4)
    
    func(11,22)       # 不给a3,a4传值,则a3,a4等于默认参数
    func(11,22,10)
    func(11,22,10,100)
    func(11,22,10,a4=100)
    func(11,22,a3=10,a4=100)
    func(11,a2=22,a3=10,a4=100)
    func(a1=11,a2=22,a3=10,a4=100)
    
    3.1.3 万能参数(用于打散)
    • *args

      可以接受任意个数的位置参数,并将参数转换成元组。

      1.调用函数无*

      def func(*args):
      	print(*args)
      	
      func(1,2)   ==> (1,2)
      func(1,2,[12,3,4])   ==> (1,2,[12,3,4])
      func((11,22,33))   ==> ((11,22,33))  # 参数是一个元组,打印出来的效果是元组套元组。
      

      2.调用函数有*

      def func(*args):
      	print(args)
      	
      func(*(11,22,33))   ==>(11,22,33)    # *是用来打散元组的,将元组中的每个元素作为参数。
      func(*[11,22,33])   ==>(11,22,33)    # *可以用来打散列表/元组 /字典/集合,只是循环内部元素
      

      3.只能用位置传参

      def func(*args):
          print(args)
      
      func(1)
      func(1,2)   # args=(1, 2)
      func((11,22,33,44,55))    # args=((11,22,33,44,55),)
      func(*(11,22,33,44,55))   # args=(11,22,33,44,55)
      
    • **kwargs

      可以接受任意个数的关键字参数,并见参数转换成字典

      1.调用函数无*

      def func(**kwargs):
      	print(***kwargs)
      
      func(k=1)    **kwargs = {'k':1}
      func(k1=1,k2=3)   **kwargs = {'k1':1,'k2':3}
      

      2.调用函数有*

      def func(**kwargs):
      	print(kwargs)
      	
      func(**{'k1':1,'k2':4,'k3':9})   **kwargs = {'k1':1,'k2':4,'k3':9}
      

      3.只能用关键字传参

    • *args/**kwargs综合使用:无敌 + 无敌 => 真无敌

      def func(*args,**kwargs):
          print(args,kwargs)
      
      func(1,2,3,4,5,k1=2,k5=9,k19=999)     *arg = (1,2,3,4,5) **kwargs = {'k1':2,'k5':9,'k19':999}
      func(*[1,2,3],k1=2,k5=9,k19=999)      *arg = (1,2,3) **kwargs = {'k1':2,'k5':9,'k19':999}
      func(*[1,2,3],**{'k1':1,'k2':3})      *arg = (1,2,3) **kwargs = {'k1':1,'k2':3}
      func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})  
      *arg = (111,222,1,2,3)   **kwargs = {'k11':'alex','k1':1,'k2':3}
      

    3.2 实参

    3.2.1 位置传参(调用函数并传入参数)(执行)

    调用/执行函数的时候严格按照位置的顺序传入参数

    def func(a1,a2,a3):
    	print(a1,a2,a3)
    	
    func(66,'alex',3)
    
    3.2.2 关键字传参(执行)

    关键字传参就是将形参放入到实参中去使用

    def func(a1,a2):
    	print(a1,a2)
    	
    func(a1=22,a2=8)
    

    关键字传参与位置传参是可以混合使用的:位置传入的参数要放在前面,关键字传参要放在后面,最后等于总参数个数

    def func(a1,a2,a3):
    	print(a1,a2,a3)
    	
    func(1,2,a3=3)
    func(1,a2=2,a3=3)
    func(a1=1,a2=2,a3=3)
    func(a1=1,2,3)  # 是错误的
    

    def func() : 自定义函数 open() 这两个为python的内置函数

    ​ pass len()

    3.3 参数相关的重点

    • 定义函数

      def func(a1,a2):
      	pass
      	
      def func(a1,a2=None):  # 对于默认值,不可变类型随便写,如果是可变类型(有坑)。
      	pass
      	
      def func(*args,**kwargs):
      	pass
      

      对于函数的默认值一般使用不可变类型,慎用可变类型:

      如果要想给value设置默认值是空列表:

      # 不推荐使用(会有坑):
      def func(data,value = [])
      pass
      
      推荐使用:
      def func(data ,value = None)
      	if not value:
              value = []
      
      # 示例:
      def func(data,value = []
      	value.append(data)
          return value
      
      v1 = func(1)   # v1 = [1]
      v2 = func(2,[11,22,33])   # v2 = [11,22,33,2]
      v3 = func(3)   # v3 = [1,3]
      

      练习题:

      • def func(a,b=[]) 有什么陷阱?

        如果不给b传参数,则默认的都是同一个地址

      • 看代码写结果

        def func(a,b=[]):
            b.append(a)
            return b
        
        l1 = func(1)
        l2 = func(2,[11,22])
        l3 = func(3)
        
        print(l1,l2,l3)   # [1,3]   [11,22,2]   [1,3]
        
      • 看代码写结果

        def func(a,b=[]):
            b.append(a)
            print(b)
            
        func(1)    # [1]
        func(2,[11,22,33])   # [11,22,33,2]
        func(3)   # [1,3]
        
    • 调用函数

      位置参数在前,关键字参数在后。

  • 相关阅读:
    剑指offer——二叉树的深度
    剑指offer——约瑟夫环
    剑指offer——矩阵中的路径
    剑指offer——机器人的运动范围
    Java一些知识
    剑指offer——判断链表中是否有环
    无序数组array, 找到数组中两个数的最大差值
    剑指offer——二叉搜索树的第k个节点
    记录结果再利用的"动态规划"之背包问题
    倍增算法
  • 原文地址:https://www.cnblogs.com/yangjie0906/p/11215734.html
Copyright © 2011-2022 走看看