python 的与众不同 -- 进阶篇(一)

2023-10-20 20:38

本文主要是介绍python 的与众不同 -- 进阶篇(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

函数简介(function)

python函数和java不同,python定义函数时参数不需要类型,返回值也不需要类型

  • 函数也是一个对象
  • 对象是内存中专门用来存储数据的一块区域
  • 函数也可用来保存很多可执行的代码,可以多次调用
  • 创建函数:def 函数名(参数,参数,…):代码块
  • 函数名() 和 函数名 区别
    函数名() 是执行函数 或者说是 调用函数
    函数名 是函数对象,可作为参数传递
  • 函数在调用时创建,调用结束后销毁

函数参数

  • 函数参数可有可无,根据需求而定
  • 函数参数可指定默认值 def 函数名([参数,参数=‘000’]):代码块
  • 关键字参数:可以不按照顺序传递参数,而直接根据参数名传递
    def test(a,b,c):pass
    #关键字参参数test(b=1,c=2,a=3)
    
  • 实参可以是任意类型,在函数中要检验数据类型

不定长参数

  • 可以在形参前加上*,这个参数就会接收所有实参以元组类型体现 称之为装包
    def test(*a):pass
    #不定个数参数
    test(1,2,3,4)
    
  • 带*号的形参不在最后时,它后边的的参数都应以关键字参数形式传递
    def test(*a,b,c):pass
    # 带*号的形参不在最后时
    test(1,2,3,4,5,6,b=7,c=8)
    
    • 带*号的形参不能接收关键字参数
    • 关键字参数可以使用**形参保存为字典,必须在最后
    def test(**a):pass
    # **形参
    test(a=6,b=7,c=8)
    

参数解包

  • 解包序列参数个数要符合函数接收参数个数
    def test(a,b,c):pass
    // 定义一个序列
    s = (1,2,3)
    // 直接传s会报错,可以解包传参
    test(*s)
    
  • 一个*是对元组,集合,列表解包,两个**是对字典解包

文档字符串

  • 在python中,可以使用help()内置函数查看函数的使用说明,如:
    # 查看函数说明时  函数要以对象方式传入,不能加()
    help(print)
    
    打印结果
    Help on built-in function print in module builtins:
    print(...)print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)Prints the values to a stream, or to sys.stdout by default.Optional keyword arguments:file:  a file-like object (stream); defaults to the current sys.stdout.sep:   string inserted between values, default a space.end:   string appended after the last value, default a newline.flush: whether to forcibly flush the stream.
    
    这个说明就是文档字符串说明
  • 编写文档字符串
    # 文档字符串非常简单,就是用三个单引号包括上
    def text(a,b,c):'''你好,我是一个测试函数的文档字符串'''print(a)
    
    打印结果
    Help on function text in module __main__:text(a, b, c)你好,我是一个测试函数的文档字符串
    
  • 编写文档字符串,并对入参出参做说明
    # 文档字符串非常简单,就是用三个单引号包括上
    # 入参出参说明 只是说明,不会强制入参出参类型
    # 解读text函数:入参为 整数类型a,字符串类型b,布尔值类型c;返回值是字符串类型
    def text(a:int,b:str,c:bool) -> str:'''你好,我是一个测试函数的文档字符串'''print(a)
    
    打印结果
    Help on function text in module __main__:text(a: int, b: str, c: bool) -> str你好,我是一个测试函数的文档字符串***Repl Closed***
    

作用域

  • 变量默认回在自己的作用域中使用,
  • 默认形况下函数中是不能修改全局变量的如果想修改,则使用关键字 global
    a = 10
    def test():global a # 声明在函数中使用的是全局变量aa = 20 # 此时就把全局变量a的值改了
  • 函数嵌套,想修改上一级函数中变量,则使用关键字 nonlocal
    def make_test():a = 10def test():nonlocal a # 声明在函数中使用的是上一级函数中变量aa = 20 # 此时就可以修改变量a的值了
    
    如果在函数内不用global声明你个,则函数内变量a只是和全局a同名,但并不是一个

命名空间

  • 命名空间实际上就是一个字典,专门存储当前作用域中的变量、函数
  • 使用 locals 来获取当前作用域的命名空间
    # 定义一些变量和函数 以作测试
    a = 10
    b = 20 
    c = 'hello'
    d = True
    e = 5.66def test_a():passdef test_b():return 10scope = locals()
    print(scope)
    
    打印结果
    {
    '__name__': '__main__', 
    '__doc__': None, 
    '__package__': None, 
    '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x003BAF40>, 
    '__spec__': None, 
    '__annotations__': {}, 
    '__builtins__': <module 'builtins' (built-in)>, 
    '__file__': 'testb.py', 
    '__cached__': None, 
    'a': 10, 
    'b': 20, 
    'c': 'hello', 
    'd': True, 
    'e': 5.66, 
    'test_a': <function test_a at 0x01188190>, 
    'test_b': <function test_b at 0x01188148>, 
    'scope': {...}
    }
    
  • locals就是一个字典,也就是说我们可以直接操作字典添加变量(一般不建议这样做)
    # 向命名空间添加一个列表变量f
    scope['f'] = ['a','b','c']
    
    打印结果
    {
    '__name__': '__main__', 
    '__doc__': None, 
    '__package__': None, 
    '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0132AF40>, 
    '__spec__': None, 
    '__annotations__': {}, 
    '__builtins__': <module 'builtins' (built-in)>, 
    '__file__': 'testb.py', 
    '__cached__': None, 
    'a': 10, 
    'b': 20, 
    'c': 'hello', 
    'd': True, 
    'e': 5.66, 
    'test_a': <function test_a at 0x013B8190>, 
    'test_b': <function test_b at 0x013B8148>, 
    'scope': {...}, 
    'f': ['a', 'b', 'c']
    }
    
  • 也可以通过命名空间获取变量
    print(scope)print('-----------------分割线-----------------')print('a = ' + str(scope['a']))
    print('f = ' + str(scope['f']))
    
    打印结果
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x037AAF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'testb.py', '__cached__': None, 'a': 10, 'b': 20, 'c': 'hello', 'd': True, 'e': 5.66, 'test_a': <function test_a at 0x038E8190>, 'test_b': <function test_b at 0x038E8148>, 'scope': {...}, 'f': ['a', 'b', 'c']}
    -----------------分割线-----------------
    a = 10
    f = ['a', 'b', 'c']
    

递归

  • 递归和循环类似,一般可以替换使用
  • 递归要满足两个条件:
    基线条件:递归不在执行的条件
    递归条件:
  • 递归就是函数自己调用自己
    # 这是一个递归的例子:求乘阶
    def factorial(n):if n == 1:return 1return n * factorial(n-1)
    

高阶函数

  • 接收函数参数 或者 将函数作为返回值的函数
  • 高阶函数 和 普通函数 的对比:
    # 比如说我们想获取列表中所有偶数
    def fn0(x):
    mlist = list()
    for s in x:if s % 2 == 0:mlist.append(s)
    return mlist# 可是我们需求又变了,想要奇数
    def fn1(x):
    mlist = list()
    for s in x:if s % 2 == 1:mlist.append(s)
    return mlist
    
  • 这样我们会多谢很多重复代码,所以我们可以使用高阶函数
    # 一个奇数原则函数
    def fn3(n):return n % 2 == 1
    # 一个偶数原则函数
    def fn4(n):return n % 2 == 0
    # 一个大于等于10原则函数
    def fn5(n):return n >= 10
    # 一个小于10原则函数
    def fn6(n):return n < 10# 根据不同原则函数 返回数据
    def fn30(fun,lit):mlist = list()for n in lit:if fun(n):mlist.append(n)return mlist# 函数使用
    print(fn30(fn3,array))
    print(fn30(fn4,array))
    print(fn30(fn5,array))
    print(fn30(fn6,array))# 这样我们就可以根据不同要求传入函数
    
    一般情况下我们们的规则都是一次性的(只有一个地方只用),这样我们创建一个函数有些多余,此时我们可以使用匿名函数

匿名函数

  • 语法:lambda 参数列表 : 返回值
  • 多数作为参数使用
    # 匿名表达式 示例
    lambda a,b : a + b # 两个入参a和b,返回a,b的和
    
    • 使用匿名函数完成高阶函数的使用
    # 根据不同原则函数 返回数据
    def fn30(fun,lit):mlist = list()for n in lit:if fun(n):mlist.append(n)return mlist# 使用
    fn7 = lambda n : n%2 == 0
    print(fn30(fn7,array))
    # 或者
    print(fn30(lambda n : n%2 == 0,array))
    
    • 只能写一些简单的表达式
    • map()
      对每个元素操作
    # 列表元素 加一
    array = [2,1,5,6,4,51,8,45,17,84,61,14,32,16,49,48,7,9,3]
    r = map(lambda i : i + 1,array)
    print(list(r))
    

闭包

  • 高阶函数中,函数返回值时函数,我们称之为闭包
  • 闭包 一定是函数嵌套
  • 写一个例子:
    假如我们写一个数值累加器
       sums = 0def sum(n):global sumssums += nreturn sumsprint(sum(1))print(sum(2))print(sum(3))print(sum(4))print(sum(5))# 我们完成了一个累加器,但是这样的累加器很危险,如果我此时添加代码:sums = 1print(sum(6))# 此时的累加器数据一定不准确,因为在途中把变量改了,可能是无意的```*使用闭包写一个数值累加器*```def make_sum():sums = 0def sum(n):nonlocal sumssums += nreturn sumsreturn sum # 返回一个函数sum = make_sum()print(sum(1))print(sum(2))print(sum(3))print(sum(4))print(sum(5))# 使用闭包,我们在外面没办法直接调用sums,所以sums变量是安全的```
    

这篇关于python 的与众不同 -- 进阶篇(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/249571

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At