Python学习第六天——函数(一)

2023-11-16

1.为什么用函数

1.代码冗余,程序组织结构不清晰,可读性差。
2.扩展性差。

2.如何让使用函数

原则:先定义后使用。
定义不会执行,但是会检查语法错误。
函数名指向内存地址存储代码信息。
先通过函数名找到函数的内存地址,然后函数内存地址的()触发代码的运行,通过returun控制返回值,可以有多个return但只能执行一次(函数立即停止)
return的返回值分为三类:
(1)返回一个值,return 1 #返回1
(2)返回多个值,return 值1,值2,值3 返回一个元组
(3)没有返回值,
①return 结束函数返回值为None
②不写 相当于在函数结尾写return None

3.函数类型

三种类型 :无参函数,有参函数,空函数

三种形式
1.语句形式 print(‘hello’)。
2.表达式形式 res = input(’>>:’)。
3.可以把函数调用当作参数传给另外一个函数。

函数参数:
1.形参:在函数定义阶段括号内定义的变量名,称为形式参数,简称形参。
2.实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参。
详解
1.位置形参:在函数定义阶段按照从左往右的顺序依次定义的形参,称之为位置形参。
特点:必须被传值,多一个不行,少一个也不行。

2.默认形参:在函数定义阶段已经为了某个形参赋值,称之为默认参数。
特点:在调用阶段可以不为其赋值。
注意:
1.默认形参的值只在函数函数定义阶段被赋值。
2.默认参数的值通常应该是不可变类型。

#例一:
m = 100
def func(x,y = m):
    print(x,y)

m=200
func(1)   #1  100

注意:不同参数类型可以混用,但是位置形参必须在默认形参前。

1.位置实参:在函数定义阶段按照从左往右的顺序依次定义的实参,称之为位置实参。
特点:按位置与形参一一对应。
2.关键字实参:在函数调用阶段按照key = value的方式为某个实参赋值,称之为关键字实数。
特点:可以打乱顺序但是依然能为指定的形参赋值。

4.* 与 ** 在形参与实参中的应用

可变长的参数:可变产的参数是指在函数调用阶段,实参的个数不固定,而实参是为形参赋值的。所以对应着必须一种特殊格式的形参,能用来接受溢出的实参。
形参中带*,*会接收溢出的位置参数,然后存成元组,然后赋值给紧跟其后的变量名。
形参中带 * *,会接受溢出的关键字参数,然后将其存成字典,然后复制给其后的变量名。
*args,*kwargs
实参中带 * ,后面跟的必须是一个可以被循环遍历的类型,*会将实参打算成为位置实参。
实参中带 **,后跟的必须是一个字典, **会将实参打散成关键字实参。

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

def wrapper(*args,**kwargs):
    func(*args,**kwargs)

wrapper(1,2,z=5)

5.命名关键字参数

在 * 与 ** 之间,必须用key = value的方式命名。
def func(x,y,*args,z=333):

6.type hinting

一般规则是在参数后面加冒号:(name:str)

7.名称空间

名称空间三大类:
1.内置名称空间:存的是Python解释器自带的名字。
2.全局名称空间:顶级定义的变量名。
3.局部名称空间:存的是函数内变量名。

#LEGB
L 当前 E 外层 G 全局 B 内置

总结:
1.访问优先级,L->E->G->B。
2。名称空间的‘嵌套’关系是在函数定义阶段,扫描语法时形成的,与调用位置无关。

8.作用域

全局作用域:内置名称空间、全局作用空间。
1.全局存活
2.全局有效
局部作用域:局部名称空间
1.临时存活
2.局部有效:函数内有效。

9.Global、Nonlocal

global:如果想在局部修改全局的名字对应的值。

#global
# x = 111
#
# def f1():
#     global x
#     x=222
#
# f1()

nonlocal:想修改函数外层包含的名字对应的值(不可变类型)。上一层没有就继续想上找,直到找到最外层函数,最后找不到会报错。

#nonlocal
# x = 0
# def f1():
#     x=1
#     def f2():
#         nonlocal x
#         x=2
#     f2()
#     print(x)
#
# f1()

10.闭函数、包涵数、闭包函数

闭函数:被封闭起来的函数,定义函数内部的函数,闭函数的特点是只能在函数内使用。
包涵数:该函数引用了一个名字,改名字来自E层。
闭包函数:定义在函数内部的函数引用了一个来自外层函数作用域中的名字。
闭包函数的升级,结合对象:

def outter():
    x = 100
    def wrapper():
        print(x)
    return wrapper

f=outter()
f()

为函数整体传参有两种解决方法:
一、直接以参数的形式传入

def wrapper(x):
    print(x)

wrapper(666)

二、包含

def outter():
    x=100
    def wrapper():
        print(x)
    wrapper()

outter()

11.装饰器-闭包函数的应用

装饰器指的是装饰别人的工具,装饰指的是违背装饰着添加新功能,实现装饰器必须遵循的原则:‘开放封闭原则’。
开放指的是对拓展的新功能是开放的。
封闭是指对修改源码以及调用方式是封闭的。
综上,装饰器指的是我们要创建一个工具,该工具可以在原则1和2下还能为装饰对象添加新功能。
原则1:不修改装饰对象源码。
原则2:不修改被装饰对象调用方式。
为什么用装饰器:再发现问题是可以快速回滚。
怎么用:装饰器->函数 ,被装饰者->函数
装饰器语法糖:@xxx
例 @outter #相当于 index = outter(index)
模板:

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

12.有参装饰器

多重装饰器的调用
有参装饰器:

# def outter2(mode):
#     def outter(func):
#         def wrapper(*args,**kwargs):
#             name = input('请输入用户名:')
#             pwd = input('请输入密码:')
#             if name == 'ml' and pwd == '123':
#                 if mode == 'file':
#                     print('基于文件的认证')
#                 else:
#                     print('基于数据库的认证')
#                 res = func(*args, **kwargs)
#                 return res
#             else:
#                 print('登陆失败')
#         return wrapper
#     return outter
#  #outter2('oracl',111,222)
# @outter2('oracl')
# def index():
#     print('from index')
#
# index()

@wraps:

# from functools import wraps
#
# def deco(func):
#     @wraps(func)  # 加在最内层函数正上方
#     def wrapper(*args, **kwargs):
#         '''怎么是你?'''
#         return func(*args, **kwargs)
#
#     return wrapper
#
# @deco
# def index():
#     '''哈哈哈哈'''
#     print('from index')
#
# print(index)
# index = deco(index)
# print(index)
#
# print(index.__doc__,index.__name__)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python学习第六天——函数(一) 的相关文章

随机推荐

  • 手撸算法-最大子数组和-牛客

    描述 给定一个数组arr 返回子数组的最大累加和 例如 arr 1 2 3 5 2 6 1 所有子数组中 3 5 2 6 可以累加出最大的和12 所以返回 题目保证没有全为负数的数据 要求 时间复杂度为O n O n 空间复杂度为O 1 O
  • css如何让块无间隙,CSS 去掉inline-block间隙的几种方法

    最近做移动端页面时 经常会用到inline block元素来布局 但无可避免都会遇到一个问题 就是inline block元素之间的间隙 这些间隙会导致一些布局上的问题 需要把间隙去掉 对于inline block元素及去掉间隙的方法 在这
  • antd中的Cascader级联选择框怎么清空重置React

    项目场景 React项目 使用antd中的Cascader级联选择框 问题描述 通过其他按钮无法重置选择框中的项 原因分析 对应解决办法一和二 1 级联选择框的数据默认是根据options绑定的数组中的value值来进行赋值显示的 可以使用
  • Python中Update()函数的使用

    简介 Python 字典 update 方法用于更新字典中的键 值对 可以修改存在的键对应的值 也可以添加新的键 值对到字典中 语法 d update e 参数说明 将e中键 值对添加到字典d中 e可能是字典 也可能是键 值对序列 详见实例
  • JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五 JVM监控及诊断工具 命令行篇 1 概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题 在用户体验至上的今天 解决好应用软件的性能问题能带来非常大的收益 Java作为最流行的编程语言之一 其应用性能诊断一直受到业界广泛关注
  • 大规模IM在线用户的计算和数据存储方案

    用户模型以及概念 月活量 基本上是总用户量 一个月不活动的用户基本上是死用户 日活量 一天中大于一定活跃时间的用户 峰值用户 一天中用户在线最高峰的用户总量 峰值并发用户 峰值用户可以同时在一秒钟发出一条消息的用户 业务消息的计算模型 当前
  • vue全屏某个dom元素(包括退出全屏、监听)

    vue全屏某个dom元素 包括退出全屏 监听 1 话不多说直接上源码 一 左上角的图标是随着DOM 元素是否全屏而改变的 二 用isFullscreen来监听DOM是否全屏 三 用screenfull toggle element 来使元素
  • C语言中打印函数的调用栈

    include
  • 娜璋初识(一)你的酒窝没有酒,我却醉得像条狗,看程序员如何表白

    这系列文章本不打算在CSDN发布 因为太腻 因为太爱 也担心读者吃不下这口狗粮 但是最近看到 情人节主题征文 活动 我俩也算是CSDN牵出的一段姻缘 索性就将该系列慢慢撰写出来 希望您喜欢 就当是程序猿的爱情周边吧 也算是对CSDN征文活动
  • 用python做一个输入半径值计算圆的面积保留两位小数_五天学会Python基础01(中)...

    语言元素 指令和程序 计算机的硬件系统通常由五大部件构成 包括 运算器 控制器 存储器 输入设备和输出设备 其中 运算器和控制器放在一起就是我们通常所说的中央处理器 它的功能是执行各种运算和控制指令以及处理计算机软件中的数据 我们通常所说的
  • Linux 自带的LED 灯驱动实验

    目录 Linux 内核自带LED 驱动使能 Linux 内核自带LED 驱动简介 LED 灯驱动框架分析 module platform driver 函数简析 gpio led probe 函数简析 设备树节点编写 运行测试 前面我们都是
  • 数学建模算法(基于matlab和python)之 Lagrange插值、Newton插值(1/10)

    实验目的及要求 1 了解多项式插值公式的存在唯一性条件及其余项表达式的推导 2 了解拉格朗日插值多项式的构造 计算及其基函数的特点 牛顿插值多项式的构造与应用 差商 差分的计算及基本性质 实验内容 1 编写Lagrange插值法 Newto
  • ctfshow-web入门——命令执行(2)(web41-web57)

    命令执行 2 web 41 if isset POST c c POST c if preg match 0 9 a z i c 过滤了数字 字母 大小写 还有一些其他符号 未过滤或运算符 和双引号 eval echo c else hig
  • Gof23设计模式之工厂方法模式和抽象工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可
  • Bootstrap3 多个模态对话框无法显示的问题

    今天帮同事调了一个代码 他们的项目最近在用Bootstrap做开发 突然间 他遇到了一个奇怪的问题 如果一个页面中 有多个Modal对话框的话 排列在第一个的对话框 能够正确显示 第二个 只能导致页面出现MASK层 却不能显示Dialog
  • 数据库作业14:第五章: 数据库完整性 习题 + 存储过程

    今有以下两个关系模式 职工 职工号 姓名 年龄 职务 工资 部门号 其中职工号为主码 Worker Wno Wname Wage Wjob Wsalary Wdept 部门 部门号 名称 经理名 电话号 其中部门号为主码 Dept Dno
  • 2D Fast Marching Computations

    Fast Marching method 跟 dijkstra 方法类似 只不过dijkstra方法的路径只能沿网格 而Fast Marching method的方法可以沿斜线 Level Set Methods and Fast Marc
  • MySQL-索引详解(四)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 树高千尺 落叶归根人生不易 人间真情 前言 本次MySQL 索引章节比较多 分为多篇进行发布 本章继续 链接
  • shell的字符串截取

    shell的字符串截取 这里介绍一下shell当中字符串截取的几种方法 假设有变量 var http www aaa com 123 htm 1 号截取 删除左边字符 保留右边字符 echo var 其中 var 是变量名 号是运算符 表示
  • Python学习第六天——函数(一)

    1 为什么用函数 1 代码冗余 程序组织结构不清晰 可读性差 2 扩展性差 2 如何让使用函数 原则 先定义后使用 定义不会执行 但是会检查语法错误 函数名指向内存地址存储代码信息 先通过函数名找到函数的内存地址 然后函数内存地址的 触发代