网站LOGO
博客 | 棋の小站
页面加载中
12月6日
达尔达尼亚瀑布,博洛尼亚,意大利 ...
网站LOGO 博客 | 棋の小站
记录学习,心得,状态,生活。
菜单
  • 热评
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    Python库推荐:地理、函数式编程
    点击复制本页地址
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    按住ctrl可打开默认菜单

    Python库推荐:地理、函数式编程

    · 原创 ·
    学学编程 · Python
    共 5155 字 · 约 5 分钟 · 379

    最近课太多了,没有太多时间浏览微信公众号了。以后可能也可能要将时间投入到新知识学习中了。这次可能是最后一次更新这个系列了。

    functools——提升函数式编程

    原文:https://mp.weixin.qq.com/s/vzpsmHG0ah_PNo0KvQBYsQ

    什么是函数式编程呢?函数式编程是一种编程范式,它将计算过程视为数学函数的求值,并强调函数纯粹性、不可变性和高阶函数的使用,以实现简洁、可靠、并行化的代码。简单来说,就是尽可能使用函数取代变量。Python作为一种面向对象的语言,在日常开发时需要调用大量和函数。functools是Python的一个标准库,不需要安装。它提供了很多函数用于优化和增强函数式编程,它们可以帮助我们处理函数、装饰器。下面用一个简单的示例演示functools里面常用的五个函数。

    下方内容是全文复制的上方链接中的文章,因为上方文章写的太好了,并且我现在已经写了三个小时不想写了,就直接复制了。

    一、partial函数
    partial函数用于部分应用一个函数的参数,返回一个新的可调用对象。它允许我们固定一个或多个函数的参数,从而创建一个接受较少参数的新函数。

    以下是一个示例代码:

    python 代码:
    from functools import partial
    
    def multiply(a, b):
        return a * b
    
    # 创建一个新函数double,固定第一个参数为2
    double = partial(multiply, 2)
    
    result = double(4)
    print(result)  # 输出:8

    在上述示例中,我们使用partial函数创建了一个新的函数double,该函数固定了multiply函数的第一个参数为2。然后我们调用double函数,传入剩余的参数4,得到结果8。

    二、wraps函数
    wraps函数是一个装饰器,用于更新装饰函数的元数据,如函数名、参数列表等。它可以帮助我们保留原始函数的信息,并避免在使用装饰器后丢失有关函数的重要信息。

    以下是一个示例代码:

    python 代码:
    from functools import wraps
    
    def my_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print("Before function execution")
            result = func(*args, **kwargs)
            print("After function execution")
            return result
        return wrapper
    
    @my_decorator
    def my_function():
        print("Inside my_function")
    
    my_function()

    在上述示例中,我们定义了一个装饰器my_decorator,并在内部使用wraps函数来更新wrapper函数的元数据。然后我们使用my_decorator装饰my_function函数,确保在执行装饰后的函数时,原始函数的信息不会丢失。

    三、lru_cache函数
    lru_cache函数是一个装饰器,用于缓存函数的结果。它可以帮助我们避免重复计算相同参数的函数结果,从而提高函数的执行效率。

    以下是一个示例代码:

    python 代码:
    from functools import lru_cache
    
    @lru_cache(maxsize=128)
    def fibonacci(n):
        if n < 2:
            return n
        else:
            return fibonacci(n-1) + fibonacci(n-2)
    
    result = fibonacci(10)
    print(result)  # 输出:55

    在上述示例中,我们定义了一个递归函数fibonacci来计算斐波那契数列。通过使用lru_cache装饰器并指定最大缓存大小,我们可以避免重复计算相同的斐波那契数,提高计算效率。

    四、reduce函数
    reduce函数是一个高阶函数,它对一个序列的元素进行累积操作,返回一个单一的值。它需要一个二元函数作为参数,并将该函数应用于序列中的相邻元素,直到将序列减少为单个值。

    以下是一个示例代码:

    python 代码:
    from functools import reduce
    
    numbers = [1, 2, 3, 4, 5]
    
    # 使用reduce函数计算列表中所有元素的乘积
    product = reduce(lambda x, y: x * y, numbers)
    print(product)  # 输出:120

    在上述示例中,我们使用reduce函数和Lambda函数计算了列表中所有元素的乘积。

    五、compose函数
    compose函数用于组合多个函数,创建一个新函数,该函数按照从右到左的顺序依次调用传入的函数。

    python 代码:
    from functools import reduce
    
    def compose(*functions):
        return reduce(lambda f, g: lambda x: f(g(x)), functions)
    
    def add_one(x):
        return x + 1
    
    def square(x):
        return x * x
    
    # 创建一个新函数,先将输入值加1,然后对结果进行平方
    add_one_and_square = compose(square, add_one)
    
    result = add_one_and_square(3)
    print(result)  # 输出:16

    在上述示例中,我们定义了一个compose函数,它接受多个函数作为参数,并返回一个新函数。这个新函数按照从右到左的顺序依次调用传入的函数。我们使用compose函数创建了一个新函数add_one_and_square,它先将输入值加1,然后对结果进行平方。然后我们调用add_one_and_square函数,传入参数3,得到结果16。

    geopy——构建基于地理位置的应用程序必备库

    我们的算法三级项目——管道铺设系统,有一部分就用到了这个库。我们为这个库提供一些坐标,它就可以为我们计算这些坐标的距离。这个坐标可以是经纬度,也可以是高德腾讯百度等地图的坐标系。这个库支持:

    1. 地理编码

    地理编码是将位置描述(例如地址或地名)转换为地理坐标(纬度和经度)的过程。Geopy 通过提供对多种地理编码服务(包括 Google 地图、Bing 地图和 OpenStreetMap)的访问,使这项任务变得简单。开发人员可以选择最适合他们需求的服务,并将其轻松集成到他们的应用程序中。

    1. 反向地理编码

    另一方面,反向地理编码将地理坐标转换为人类可读的地址或地名。Geopy 通过允许开发人员获取有关特定纬度和经度点的详细信息来支持此功能。这对于需要向用户提供基于位置的信息(例如查找附近的兴趣点)的应用程序特别有用。

    1. 距离计算

    Geopy 还提供地理坐标之间的距离计算功能。无论你需要计算地球表面上两点之间的大圆距离还是确定两个位置之间的行驶距离,Geopy 都能简化这些任务。它支持多种距离算法,包括 Haversine 和 Vincenty,确保距离计算的准确性。

    拿我们的算法三级项目里的代码做个示例(这个代码不在github开源的那个版本内,是另外一个项目的,但是做的是同一个题目):

    运行结果如下图。

    python 代码:
    from geopy.distance import geodesic
    
    # 从控制台接收四个值
    print("请输入第一个点的纬度和经度,以空格分隔:")
    lat1, lon1 = map(float, input().split())
    print("请输入第二个点的纬度和经度,以空格分隔:")
    lat2, lon2 = map(float, input().split())
    
    # 计算两点之间的直线距离
    point1 = (lat1, lon1)
    point2 = (lat2, lon2)
    distance = geodesic(point1, point2).kilometers
    
    print(f"两点之间的直线距离为: {distance} 公里。")
    运行结果运行结果

    Rich——美化终端显示效果

    这个库以前貌似推荐过,但是这次的更详细。

    Rich可以将常量按照它们的类型输出不同的效果,以提高控制台程序的可读性。Rich库不是内置库,需要使用pip安装。

    先来看一看使用Rich库之后运行结果是怎么样的。

    Rich美化终端输出结果Rich美化终端输出结果

    可以看到美化的还是可以的,下方简单介绍一下这个库的常用用法。

    原文链接:https://mp.weixin.qq.com/s/rvTLV15qF5CTjHcADDo9Hw
    原文介绍的很详细,可以阅读全文来仔细学习,这里只是简单介绍一下。
    python 代码:
    >>> from rich import inspect
    >>> inspect(list)
    使用inspect函数查看对象信息使用inspect函数查看对象信息 python 代码:
    >>> inspect(list, methods=True)

    ![使用inspect函数查看对象信息]][4]

    python 代码:
    from rich.console import Console
    from rich.table import Table
    
    table = Table(title="国内生产总值指数")
    
    table.add_column("年份", justify="left", style="cyan", no_wrap=True)
    table.add_column("指标", style="magenta")
    table.add_column("数值", justify="right", style="green")
    
    table.add_row("2022年", "国民总收入指数", "4432.1")
    table.add_row("2021年", "国民总收入指数", "4319.7")
    table.add_row("2020年", "国民总收入指数", "3979.1")
    table.add_row("2019年", "国民总收入指数", "3912.1")
    
    console = Console()
    console.print(table)
    输出表格输出表格

    更多功能可以前往公众号的文章学习,介绍的很全面。

    声明:本文由 (博主)原创,依据 quote 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    现在已有

    4

    条评论
    发一条!
    1. 头像
      Kevin
      头像 Kevin
      • 等级:Lv.1
      • 角色:访客
      • 在线:本月

      又是一个会Python的大佬

      · · · 海外
      1. 头像
        Kevin

        努力学习你也可以

        · · · 海外
    2. 头像
      时光日志
      • 等级:Lv.2
      • 角色:生活 · 好友
      • 在线:本月

      真羡慕你们会代码

      · · · 海外
      1. 头像

        可事实是跟我一个专业的,计算机专业的同班同学,还有很多啥也不会写的

        · · · 河北-秦皇岛
    博客logo 博客 | 棋の小站 记录学习,心得,状态,生活。
    ICP 冀ICP备2023007665号 ICP 冀公网安备 13030202003453号

    🕛

    本站已运行 221 天 14 小时 27 分

    👁️

    今日访问量:274 昨日访问量:2564

    🌳

    建站:Typecho 主题:MyLife
    博客 | 棋の小站. © 2023 ~ 2023.
    网站logo

    博客 | 棋の小站 记录学习,心得,状态,生活。
     
     
     
     
    壁纸
     
     
     
     

    4

    1

  • 下一篇