for each循环_Power Query — 循环初步

142179aa52d5e59bec1bc5452b0dc083.png

题记:

《Excel圣经》1:3 微软说,“要有循环”,便有了循环。


引子:

keyword: one of and as each else error false if in is let meta not otherwise or section shared then true try type #binary #date #datetime #datetimezone #duration #infinity #nan #sections #shared #table #time

可以发现M语言的关键字里面并没有for/while这样的关键字,那么M如何实现循环呢?


遍历:

M实现循环是通过特定的函数或者运算符来实现的,按照实现原理的不同,可以初步地分为——遍历迭代递归三大类,我们先看一些简单的遍历案例:

~~~~~~~~~~

案例1:不使用Repeat函数,生成一个list,里面有20个Number "1"。

~~~~~~~~~~

在M语言中,就有一个函数可以遍历一个list,它就是List.Transform ——

List.Transform(list as list, transform as function) as list

这个函数实现的功能其实是“list内元素转化”的功能,但由于这个过程会遍历list中的每一个元素,因此我们可以把这个函数当做for循环来使用:

= List.Transform({1..20},(x)=>1)

0bc13aa485cb0843fefbcb75298f7ae1.png

我们再看看这个实现过程:将构造的{1..20}的每一个元素都转化为1,构造了1~20共20个元素的序列,因此最终转化的结果也是有20个数字1的list。

~~~~~~~~~~

案例2:使用List.Transform函数,生成20以内的全部奇数。

(List.Numbers可以快捷实现,本节重点介绍的是循环,因此不使用)

~~~~~~~~~~

我们知道全体奇数可以通过自然数来构造,因此我们容易想到:

= List.Transform({1..10},(x)=>2*x-1)

ea8a669cbdd1e9961fca0f17573ff349.png

我们回顾下实现过程,20以内最大的奇数是19,而19=2*10-1,因此我们需要构造{1..10}这样的list来进行遍历,通项公式就是(x)=2*x-1

~~~~~~~~~~

案例3:使用质数的定义证明19是质数。

~~~~~~~~~~

质数定义:在大于1的自然数中,除了1和它本身以外不再有其它的因数。

所谓因数就是能够整除给定的数,我们可以通过Mod函数来判断,只要余数为0,那就是因数,因此我按照定义把2~18全部逐一验证遍即可:

= List.Min(List.Transform({2..18},(x)=>Number.Mod(19,x)))

06b2b80aa5a2d678d559b3e2bad682bd.png

上述表达式结果为1,说明2~18分别除19得到的余数list中最小值为1,没有0,也就是19除了1和自身外不再有其它的因数了,因此19为质数。


迭代:

我们先考察一个简单的计数问题:10以内偶数的个数是多少?

显然使用List.Count是无法得到结果的,最简单的思路就是我们假设有一个容器专门用来实现计数的功能,逐一判断10以内的每一个自然数是不是偶数,如果是偶数,计数器就加一。那么对于计数器的上一个结果来说,每次新出现一个偶数,计数器的结果就“迭代”更新了一次。

上述解决问题的过程就是接下来要介绍的迭代循环了。

~~~~~~~~~~

案例4:10以内的奇数有多少个?

~~~~~~~~~~

在M中,Accumulate函数具有积累的功能,可以实现“容器”迭代的功能,我们通过Number.IsOdd函数来对每一个数做是否为奇数的判断:

List.Accumulate(list as list, seed as any, accumulator as function) as any

这个函数需要给定一个种子参数作为起始值,然后根据指定的function进行迭代运算。

= List.Accumulate({1..10},0,(x,y)=>if Number.IsOdd(y) then x+1 else x)

300d48029ca22b43ab2ef1ac5278f835.png

我们回顾下迭代的过程:

首先计数器(seed)的初始值为0,然后开始对{1..10}依次做判断,(x,y)的x就是上一次的seed,而y就是当前{1..10}的一个值;最初x为0,y为1,然后y依次为2~10,x对应的为上一次function运算结束后的那个值;因此1判断为奇数时x就执行了then x+1(这里面的x还是seed的值:0),因此当对y=2做判断时,就执行了else x,x值不变,当全部判断完时,输出x最后的值,也就是5,这样就完成了整个迭代循环。

~~~~~~~~~~

案例5:使用迭代循环的方法倒序输出“Hello World!”。

~~~~~~~~~~

既然要求使用迭代,那么就要想清楚“容器”里面到底装什么内容,这个例子需要倒序输出,我们不妨将最终输出的结果理解为一个一个字符拼接成的字符串,这样我们就知道怎么构造这个字符串容器了:

= List.Accumulate({0..(Text.Length("Hello World!")-1)},"",(x,y)=>

x&Text.At("Hello World!",Text.Length("Hello World!")-y-1))

ef35122f325b5bef4598fbef1ba9b13b.png

这里使用了一个小技巧,使用了N-x的结构构造一个降序的list,实现顺序迭代时是从后向前进行的,然后使用字符串容器保存这些迭代的字符串,最终输出。


递归:

前面介绍过@这个符号,它的作用是调用后面的内容,后面接函数时,就是递归了。

我们通过一个简单的例子来看看递归的作用和用法:

~~~~~~~~~~

案例6:计算9!(不使用Number.Factorial)。

~~~~~~~~~~

let

factorial=(x)=>if x=1 then 1 else x*@factorial(x-1)

in

factorial(9)

2b9678518ee52e2a8d8ae5ebfaba455e.png

我们把这个语句和高中学的数列对应起来就好理解了,首先告知首项f(1)=1,然后使用递归的方法写出递推公式f(n)=n*f(n-1),最后求第9项。

不难发现,递归具备如下几个特点:

1.函数调用了自身,并用“@”进行函数名的标识;

2.调用自身时,参数会发生变化,避免无限递归;

3.通过 if 语句对特定参数的函数值进行了定义。

~~~~~~~~~~

案例7:求36和63的最小公倍数。

~~~~~~~~~~

我们都知道两个整数的最小公倍数等于两数之积除以两数的最大公约数,因此这个案例如果能够解决如何求最大公约数,问题也就迎刃而解了,下面先介绍一种比较高效的算法。

辗转相除法:

用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止,最后的除数就是这两个数的最大公约数。

这里面核心递归的是什么步骤?这个一定要理清楚,否则就写不出正确的递归语句。看完介绍后可以发现,最核心的一步就是用余数去除除数,如果不好理清余数除数的关系,你就这样理解:用最小的那个数去除中间的数。(被除数最大,除数第二排中间,余数最小)

let

GCD=(x,y)=>if y=0 then x else @GCD(y,Number.Mod(x,y))

in

36*63/GCD(36,63)

66e2915ef95ee971171cf937f0cb84e2.png

我们用数列的递推公式思路把这个案例的核心步骤理一理:

GCD(x,y)=GCD(y,Number.Mod(x,y))

用语言描述就是:大数和小数的最大公约数等于小数和两数取余的最大公约数。


for循环和while循环:

前面的遍历基本上可以实现for循环的效果了,那么while循环与哪一个函数最接近呢?

这里介绍一个用得稍微少一点的循环函数:

List.Generate(initial as function,condition as function,next as function, optional selector as nullable function) as list

~~~~~~~~~~

例如下面这段Python代码:

#!/usr/bin/python3

i=0

while i<10:

i=i+1

print(i)

87ff867e4c346115d09e3be1c85a7cca.png

~~~~~~~~~~

使用M语句就是:

let

list=List.Generate(()=>1, each _ <11, each _ + 1)

in

list

7136f873344b306032c471c385423725.png

这个函数的特点也是有初始值,然后有一个条件判断,条件内会一直循环下去。


下篇笔记:《循环嵌套与综合应用》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 直接映射 页表大小,linux 启动过程临时页表到底映射了多大内存?

从linux-2.4内核开始&#xff0c;在建立临时页表的时候&#xff0c;一般的教科书都说是映射了8M的物理内存&#xff0c;但是为什么是映射8M呢&#xff1f;当时网上有资料说&#xff0c;8M足够了&#xff0c;但为什么就足够了&#xff0c;一直没有彻底搞清楚&#xff0c;今天又重…

字符串字段当条件查询的时候需要加引号吗_如此详细的SQL优化教程,是你需要的吗?...

基础数据准备二&#xff1a;五百万数据插入上面插入几条测试数据&#xff0c;在使用索引时还需要插入更多的数据作为测试数据&#xff0c;下面就通过存储过程插入500W条数据作为测试数据三&#xff1a;使用索引和不使用索引的比较没有添加索引前一个简单的查询用了1.79秒创建索…

使用CoreImage教程

使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image) fixImageWidth(image, 320.f)// 固定图片的宽度 UIImage * fixImageWidth(UIImage *image, CGFloat width) {f…

电脑生成siri语音_米家智能台灯1S全新升级,支持小爱和Siri的语音控制

夜晚的灯光是我们最为需要的东西&#xff0c;但很多时候&#xff0c;我们需要灯照在不同的地方&#xff0c;平时我只靠吸顶灯的光来照亮家里的每一个角落&#xff0c;甚至是看书的时候都只靠吸顶灯照明。台灯作为占用面积小&#xff0c;光照均匀&#xff0c;让很多的人越来越依…

linux vnc检查,检查Ubuntu VNC设置(避免远程登陆)

(1)安装x11vncsudo apt-get install x11vnc(2)将x11vnc加入xinetdsudo gedit /etc/xinetd.d/x11vnc加入下面这段service x11vnc{ port 5900 type UNLISTED socket_type stream protocol tcp wait …

JavaScript网络地址作为参数_JavaScript之bind的模拟实现

阅读本文约需要5分钟大家好&#xff0c;我是你们的导师&#xff0c;我每天都会给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。昨天给大家分享了JavaScript的call和apply的模拟实现&#xff0c;今天给大家分享一下bind的模拟实现。什么是bind&#xf…

cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项

1、环境cdh5.12.3spark2 2.3.02、需要本地地洞spark2-shell用于环境测试错误一&#xff1a;Error: A JNI error has occurred, please check your installation and try againException in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Loggerat java.l…

python语音转文字软件_python编写语音转文字软件|语音转文字工具免费版下载(语音批量转换文字) v2.0 最新版_数码资源网...

没有专业的工具怎么能够将语音转换为文字呢&#xff1f;小编为大家提供了语音转文字工具免费版&#xff0c;一款通过Python编写语音转文字软件。用户通过使用语音转文字工具免费版&#xff0c;可以将语音批量转换文字&#xff0c;而且操作也是非常的简单&#xff0c;如果你需要…

Spring-bean作用域scope详解

2019独角兽企业重金招聘Python工程师标准>>> 默认情况下&#xff0c;从bean工厂所取得的实例为Singleton&#xff08;bean的singleton属性&#xff09; Singleton: Spring容器只存在一个共享的bean实例&#xff0c;是默认的配置。 Prototype: 每次对bean的请求都会创…

c语言怎么写星星代码,C语言打印星星的问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include int main(void){int index, up, lines;printf("请输入将要显示的行数:\n");while(scanf("%d", &up) 1){if(up % 2 0){for(lines 1; lines < up / 2; lines){for(index 0; index …

c语言计算机猜数字100以内,求一个猜数字C语言代码,要求如下 计算机生成一个100以内的随机数,玩家来猜 记录猜的次数,最后打...

满意答案itpotato推荐于 2017.10.09采纳率&#xff1a;51% 等级&#xff1a;12已帮助&#xff1a;4600人/**百度知道越来越水了&#xff0c;这么简单的题就一个回答*没见过限定头文件数目的。。而且是限定至少。。。。*/#include#include#include#includeint getrand(){sran…

fakeapp2.2.0下载_软件下载 | SuperCuger 测量平差系统 V1.0

SuperCuger测量平差系统 version 1.0 是一款基于测绘工程中边角网、测角网、测边网、水准网测量数据的免费开源的可视化平差系统。可用于测绘工程中测量平差计算和平差结果报告生成&#xff0c;和插件(中间件)模式扩展新的平差功能。我们的软件具备平差数据可视化&#xff0c;便…

c语言cin输入数组,C++基础:各种输入方法总结cin.get()、

原标题&#xff1a;C基础&#xff1a;各种输入方法总结cin.get()、在C中&#xff0c;各种输入方法还是不少的&#xff0c;而且各有所异&#xff0c;本文做一点简要总结&#xff0c;主要涉及如下内容&#xff1a;cin、cin.get()、cin.getline()、getline()、gets()、getchar()。…

手机怎么能把书签导出来_成人高考能在手机上报名吗?成人高考怎么缴费?

很多成人高考的考生在报名考试的时候想用手机进行报名&#xff0c;但是听说都是使用电脑报名&#xff0c;所以不知道手机报名行不行&#xff0c;另外还有很多考生也不知道如何缴费。那么成人高考能在手机上报名吗?成人高考怎么缴费?下面小编就来和大家聊一聊成人高考手机报名…

thinkphp单入口和多入口的访问方法

完全是参考thinkphp的官网资料 现在, 基本上都是 用 单入口 的方式来做的! thinkphp可创建多入口和单入口两种模式&#xff0c;本文主要讲解创建方法和两者的区别。 TP版本&#xff1a;3.1.3 前端&#xff1a;Home&#xff0c;后台&#xff1a;Admin 一. 创建方法 单入口&#…

财务模块的一些基础概念

财务会计承担着企业总体信息管理和传递的职能&#xff0c;无论企业采用何种运营模式、经营何种业务&#xff0c;都离不开财务的支持&#xff0c;大多数运营和管理流程均与财务存在着接口&#xff0c;为此&#xff0c;优化、高效的财务运作模式和流程成为确保企业良性发展和业务…

if mybatis tk 多个_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?...

前言这是 mybatis 比较常问到的面试题&#xff0c;我自己在以前的面试过程中被问到了2次&#xff0c;2次都是非常重要的面试环节&#xff0c;因此自己印象很深刻。这个题目我很早就深入学习了&#xff0c;但是一直没有整理出来&#xff0c;刚好最近一段时间由于工作太忙&#x…

多机器使用setnx 设置同一个key_Redisson分布式锁的简单使用

做一个积极的人编码、改bug、提升自己我有一个乐园&#xff0c;面向编程&#xff0c;春暖花开&#xff01;一&#xff1a;前言我在实际环境中遇到了这样一种问题&#xff0c;分布式生成id的问题&#xff01;因为业务逻辑的问题&#xff0c;我有个生成id的方法&#xff0c;是根据…

孟德尔随机化周报 (12.14)

欢迎报名2023年郑老师团队课程&#xff01; 郑老师科研统计培训&#xff0c;包括临床数据、公共数据分析课程等&#xff0c;欢迎报名 孟德尔随机化,Mendilian Randomization&#xff0c;简写为MR&#xff0c;是一种在流行病学领域应用广泛的一种实验设计方法&#xff0c;利用公…

android计算器弹窗,android实现简易计算器

本文实例为大家分享了android实现简易计算器展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下效果图&#xff1a;一、如图&#xff0c;首先布局计算器主页显示activity_main.xmlxmlns:tools"http://schemas.android.com/tools"android:layout_width&qu…