python — 函数基础知识(一)

目录

  • 1 面向过程编程与函数式编程
  • 2 函数的基本结构
  • 3 函数的参数

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(["李邵奇", '[email protected]'])
    msg['To'] = formataddr(["管理员", '[email protected]'])
    msg['Subject'] = "情爱的导演"

    server = smtplib.SMTP("smtp.163.com", 25)
    server.login("[email protected]", "qq1105400511")
    server.sendmail('[email protected]', ['管理员', ], 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(["李邵奇", '[email protected]'])
    msg['To'] = formataddr(["业务员", '业务员'])
    msg['Subject'] = "情爱的导演"

    server = smtplib.SMTP("smtp.163.com", 25)
    server.login("[email protected]", "qq1105400511")
    server.sendmail('[email protected]', ['业务员', ], 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(["李邵奇", '[email protected]'])
    msg['To'] = formataddr(["老板", '老板邮箱'])
    msg['Subject'] = "情爱的导演"

    server = smtplib.SMTP("smtp.163.com", 25)
    server.login("[email protected]", "qq1105400511")
    server.sendmail('[email protected]', ['老板邮箱', ], 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(["李邵奇", '[email protected]'])
    msg['To'] = formataddr(["老板", '老板邮箱'])
    msg['Subject'] = "情爱的导演"

    server = smtplib.SMTP("smtp.163.com", 25)
    server.login("[email protected]", "qq1105400511")
    server.sendmail('[email protected]', ['老板邮箱', ], 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(["李邵奇", '[email protected]'])
    msg['To'] = formataddr(["导演", to])
    msg['Subject'] = "情爱的导演"

    server = smtplib.SMTP("smtp.163.com", 25)
    server.login("[email protected]", "qq1105400511")
    server.sendmail('[email protected]', [to, ], msg.as_string())
    server.quit()
"""
def send_email(to):
    template = "要给%s发送邮件" %(to,)
    print(template)

user_input = input('请输入角色:')

if user_input == '管理员':
    send_email('[email protected]')
elif user_input == '业务员':
    send_email('[email protected]')
elif user_input == '老板':
    send_email('[email protected]')

练习题

# 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('管理员','[email protected]')
elif user_input == '业务员':
    send_email('业务员','[email protected]')
elif user_input == '老板':
    send_email('老板','[email protected]')

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]
  • 调用函数

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

原文地址:https://www.cnblogs.com/yangjie0906/p/11215734.html

时间: 2024-08-08 02:15:14

python — 函数基础知识(一)的相关文章

10分钟学会Python函数基础知识

看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用. 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验).我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可.那么,这样就提高了代码的

10分钟学会 Python 函数基础知识

一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用. 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验).我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可.那么,这样就提高了代码的复用率了,整体代码看起来比较简练,没有那么臃肿了. 函数在Python中是最基本的程序结构,用来最大化地

教你快速学会 Python 函数基础知识

一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行.Python中的函数在其他语言中也叫做过程或子例程,那么这些被包装起来的语句通过一个函数名称来调用. 有了函数,我们可以在很大程度上减少复制及粘贴代码的次数了(相信很多人在刚开始时都有这样的体验).我们可以把相同的代码可以提炼出来做成一个函数,在需要的地方只需要调用即可.那么,这样就提高了代码的复用率了,整体代码看起来比较简练,没有那么臃肿了. 函数在Python中是最基本的程序结构,用来最大化地

python 函数基础知识整理

一.函数的定义: 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开... 空格 为了将def关键字和函数名分开 函数名:必须由字母下划线数字组成,不能是关键字,不能是数字开头,函数名还是要有一定的意义能够简单说明函数的功能 括号:是必须加的 注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行.以增强代码的可读性. 调用:就是 函数名() 要记得加上括号 def 函数名(参

python — 函数基础知识(二)

目录 1 返回值 2 作用域 3 函数小高级 4 函数中高级 1 返回值 def func(arg): # .... return 9 # 返回值为9 默认:return None val = func('adsfadsf') # 1. 让用户输入一段字符串,计算字符串中有多少A字符的个数.有多少个就在文件a.txt中写多少个"李邵奇". def get_char_count(data): sum_counter = 0 for i in data: if i == 'A': sum_

Python入门基础知识实例,值得收藏!

7月的编程语言指数榜已经发布,Python 在今年5月首次超越 Java 拿下榜首位置后,仍保持上涨趋势,正逐渐与 Java 拉开差距.(图为与去年 7 月数据对比) 上周为大家简单介绍了如何安装Python和配置环境?相信大家都将Python安装成功了吧~今天小白就为大家分享一些Python的基础知识,希望大家都能快速入门Python~ 1.在Python 语言中,对象是通过引用传递的. 在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量. 如:x=

VII python(1)基础知识

VII Python(1)基础知识 1989年诞生(同LinuxOS),google推崇,06年后才开始在中国流行,08年运维开始使用python www.python.org(主流OS默认配的python为2.6或2.7,最好在Ubuntu12.10上使用python,对于开发很方便,否则会浪费很多时间在装某一软件包) https://www.python.org/ftp/python/ Python(简单.容易上手.语法非常简明,任何功能都可实现:胶水语言,粘合剂,能与任何语言结合起来(如j

Python 面向对象基础知识

面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass # obj是对象,实例化的过程 obj = 类() obj.函数1() ========== 面向对象不好 ============ ========== 函数编程好 ============== - 有时候,函数编程能实现?比较麻烦. - 面向对象非常的简单就能实现. 3.什么时候适用面向对象?

Python爬虫基础知识及前期准备

学习爬虫有一小段时间了,于是决定把自己学爬虫时所学的,写过的代码以及看过的文档记录下来,权当小结.第一次写这些,如果有错误,请多指教. 首先我们需要了解一下什么是爬虫. 根据百度百科上给出的定义," 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本."简单来说,爬虫类似手动下载网页信息,比如小说.歌曲.说到这,或许会有疑问,既然这样,干嘛还去敲代码,直接人工处理不好吗?话是这么说,但如果下载的