首页 > 其他分享 >mojo 介绍

mojo 介绍

时间:2023-08-25 15:58:28浏览次数:28  
标签:函数 Python 介绍 Mojo Int print mojo fn

:本文是根据官方网站翻译得来,其中做了部分修改用于理解文章字义。

目录

mojo介绍

Mojo被设计为Python的超集,因此许多语言功能和你可能在Python中知道的概念可以直接翻译成Mojo。例如一个 Mojo中的“Hello World”程序看起来和Python一模一样:

print("hello world")
hello world

您还可以导入现有的 Python 包并使用它们,就像您用Python编程,但我们稍后会谈到这一点。

但是,重要的是要知道Mojo是一种全新的语言。 拥有,而不仅仅是带有额外糖的 Python 的新实现。当你了解有关Mojo的更多信息,您会发现它与Mojo有更多共同点像 Rust 和 C++ 这样的语言,除了它使用 Python 语法并完全支持导入的 Python 包。

所以让我们开始吧!本笔记本介绍了 Mojo 语言的基础知识,并且只需要一点编程经验。

如果您想了解有关该语言的更多详细信息,请查看Mojo编程手册

语言基础

首先,Mojo是一种编译语言,它的很多性能 内存安全功能就是从这一事实派生出来的。Mojo代码可以是 提前编译(AOT)或实时(JIT)。mojo也支持REPL 环境,例如运行 Jupyter 笔记本中的代码的环境(命令行 REPL 即将推出)。

像其他编译语言一样,Mojo需要一个函数作为 程序的入口点。例如:main()

# 首先创建一个 .mojo 的文件 文档上说文件名可以有表情可以试试

fn main():
	var x: Int = 1
	x +=1 
	print(x)
main()
2

如果你了解Python,你可能会期望“def main()”而不是“fn main())”。两者实际上都在Mojo中工作,但使用“fn”的行为有点不同,我们将下面讨论。

当然,在REPL环境中不需要“main()”函数,因为如上面所示,当我们打印没有“main()”函数的“helloworld”时。但是,当您想编写自己的.mojo时,需要main()函数程序。

语法语义

Mojo使用了Python的所有语法和语义。(如果你不是 熟悉Python语法,网上有大量很棒的资源可以 教你。

例如,像Python一样,Mojo使用换行符和缩进来定义代码。 块(不是大括号),Mojo支持Python的所有控制流语法 例如条件和循环。if``for

但是,Mojo仍在进行中,因此Python中有一些东西。 尚未在 Mojo 中实现(请参阅 Mojo 路线图)。所有缺失的Python功能会及时到来,但Mojo已经包含许多功能和 超出 Python 中原有的功能的功能。

因此,以下各节将重点介绍一些语言功能 是Mojo独有的(与Python相比)。


Mojo函数可以用“fn”(如上所示)或“def”(如Python中)。“fn”声明强制执行强类型和内存安全行为,而“def”提供Python风格的动态行为。

“fn”和“def”函数都有其值两者兼而有之。然而,为了本介绍的目的,我们将仅关注“fn”函数。有关两者的更多详细信息,请参阅编程手册

在以下部分中,您将了解“fn”函数是如何强制执行的代码中的强类型内存安全行为


您可以使用声明变量,例如上面的“main()”函数中的“x”`var’创建可变值,或者使用let’创建不可变值。

var: 声明全局变量(表示可以在全局获取到),在mojo 中用var 声明的变量是可变的

let:声明临时变量(例:在函数或循环中声明,那么只能在函数中获取,在函数外或者其他函数中是获取不到该值的),let声明的变量是不可变的

继续,在上面的“main()”函数中将“var”更改为“let”,然后运行它。您将得到如下编译器错误:

fn main():
	let x: Int = 1
	x +=1 
	print(x)
main()

```
error: Expression [15]:7:5: expression must be mutable for in-place operator destination
    x += 1
    ^
```

# 错误:表达式[15]:7:5:对于就地运算符目标,表达式必须是可变的

这是因为“let”使其不可变,所以不能增加值。如果你删除“var”,你会得到一个错误,因为“fn`函数需要显式的变量声明(与“def”函数不同)。

fn main():
    x = 1
main()

"""
error: Expression [1]:6:5: use of unknown declaration 'x', 'fn' declarations require explicit variable declarations
    x = 1
    ^

expression failed to parse (no further compiler diagnostics)
"""

错误:表达式[1]:6:5:使用未知声明“x”、“fn”声明需要显式变量声明
x=1
^
表达式解析失败(没有进一步的编译器诊断)

最后,请注意,“x”变量有一个显式的“Int”类型规范。“fn”中的变量不需要声明类型,但是需要声明var let,有时如果省略声明类型,Mojo将推断类型,如下所示:

fn do_math():
    let x: Int = 1
    let y = 2
    print(x + y)

do_math()

3

函数参数和返回

与局部变量不同,函数中的参数必须指定类型。fn若要从函数返回值,必须使用签名末尾的箭头。fn``->

例如:

fn add(x: Int, y: Int) -> Int:
    return x + y

z = add(1, 2)
print(z)

3

参数可变性和所有权

自变量的可变性和所有权

现在,让我们探讨如何在函数中共享参数值。

请注意,如上所述,“add()”不会修改“x”或“y”,它只读取价值观事实上,正如所写的,函数不能修改它们,因为fn默认情况下,参数是不可变的引用

就论点惯例而言,这被称为“借用”,尽管作为“fn”函数的默认值,可以使用borrowed声明如下(其行为与上面的“add()”完全相同):

fn add(borrowed x: Int, borrowed y: Int) -> Int:
    return x + y

如果希望参数是可变的,则需要声明该参数inout。这意味着对参数in侧所做的更改函数在函数外可见。

例如,此函数可以修改原始变量:

fn add_inout(inout x: Int, inout y: Int) -> Int:
    x += 1
    y += 1
    return x + y

var a = 1
var b = 2
c = add_inout(a, b)
print(a)
print(b)
print(c)

2
3
5

另一种选择是将参数声明为“owned”,这提供了函数对值的完全所有权(使他成为可变的,并保证是唯一的)。这样,函数可以修改值,而不用担心影响函数外的变量。例如:

fn set_fire(owned text: String) -> String: 
    text += "

标签:函数,Python,介绍,Mojo,Int,print,mojo,fn
From: https://www.cnblogs.com/shuai-miss/p/17657113.html

相关文章

  • 大型电商网站:第二章:项目开发介绍
    下面是我要写的一个简单的SOA面向服务分布式架构:业务功能主要参考京东商城,当然了京东做的功能太多了,我就挑几个觉得比较实用的,简单的写写,这在后面几章会慢慢的写出来。主要功能模块:用户模块、后台管理模块、商品详情模块、商品检索模块、购物车模块、登录模块、订单模块和支付模......
  • Cognex InSight 电子表格视图功能介绍
    1.界面预览:这里我们将整体界面大致分为7个大的部分,当然布局可以按照自己的习惯自由拖放,这里只展示默认视图。各部分的功能说明:①菜单栏:这里对关键几个功能做介绍,没有提到都不是很重要 查看:当界面上的某一部分没有显示时,可以通过查看菜单重新打开。 传感器: 帮助–InS......
  • untity的SerializedProperty介绍
    SerializedProperty是Unity中用于访问和修改序列化对象属性的类。在Unity中,序列化对象是指可以在Inspector面板中显示和编辑的对象,例如组件、脚本等。SerializedProperty提供了访问和修改序列化对象属性的方法,可以通过它来获取属性的值、设置属性的值、判断属性是否可见、获取属......
  • spark配置文件介绍
    spark配置文件介绍spark有很多参数,然后会有不同的配置文件,这里做一下介绍,也供自己以后查询。1.sparkproperties:这个可以控制应用程序的绝大部分属性。并且可以通过SparConf对象挥着Java系统属性进行配置;2.环境变量(Environmentvariable):这个可以分别对每台机器单独进行相应设置,比......
  • 自我介绍
    关于姓名我的名字叫“王荣盛“,当然我也不知道父母是因什么而起这个名字,但是我知道有一个成语叫“繁荣昌盛”。荣,本义为花,后指草木繁茂,晋陶渊明曰“木欣欣以向荣”,便是此意。盛者,指事物规模巨大,兴旺,亦有繁茂之意。由此猜测,大概是父母想让我能够发愤图强,干出一番成绩,在人生的旅途上......
  • 视频智能分析平台EasyCVR视频汇聚平台关于AI分析告警列表的定制详细介绍
    安防监控视频集中存储/云存储EasyCVR视频汇聚平台基于云边端一体化架构,可支持多协议、多类型设备接入,视频监控综合管理平台具有强大的数据接入、处理及分发能力,能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、存储、集中管理。 ​ 我们......
  • PCB工艺制程能力介绍及解析(上)
    一个优秀的工程师设计的产品一定是既满足设计需求又满足生产工艺。规范产品的电路设计,辅助PCB设计的相关工艺参数,使得生产出来的实物产品满足可生产性、可测试性、可维修性等的技术规范要求。本文将从初学者的角度出发,带你快速了解PCB制造中的常用基本概念。我们在华秋PCB下单时,......
  • 安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍
    安防监控/视频集中存储/云存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。由于EasyCV......
  • Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器
    转自:https://blog.csdn.net/B11050729/article/details/132353220 ......
  • VisionPro 软件介绍
    VisionPro软件介绍一VisionPro的四种开发模式1.Quickbuild视觉+向导生成的操作界面Quickbuild视觉 向导生成的操作界面2Quickbuild视觉+修改的操作界面使用QuickBuild互动开发视觉、输入和输出和工作控件使用应用程序向导生成操作界面(VB或者C#)使用VisualStudio定......