for循环

Python3 撸代码窍门,怎样用 Map, Filter, Reduce 代替 For 循环.

拈花ヽ惹草 提交于 2020-04-08 10:52:24
感谢作者分享- http://bjbsair.com/2020-04-07/tech-info/30736.html 你是否有过这样的经历,你查看自己写的代码并看到满眼的 for 循环?你发现你必须斜着你的眼睛,并将脑袋前倾到你的显示器,以看得更清楚。 反正我有过这样的经历。 for 循环就像是一把瑞士军刀,它可以解决很多问题,但是,当你需要扫视代码,快速搞清楚代码所做的事情时,它们可能会让人不知所措。 map、filter 和 reduce 这三种技术可以提供描述迭代原因的函数替代方案,以便避免过多的 for 循环。我之前在 JavaScript 中写过这些技术的入门文章,但是它们在 Python 中的实现略有不同。 我们将简要介绍这三种技术,主要介绍它们在 JavaScript 和 Python 中的语法差异,然后给出如何转换 for 循环的示例。 什么是 Map、Filter 和 Reduce? 回顾我以前编写的代码,我意识到 95% 的时间都花在遍历字符串或数组上。在这种情况下,我会执行以下操作之一:将一系列语句映射到每个值,筛选满足特定条件的值,或将数据集减少为单个聚合值。 有了这种洞察力,你就可以识别和实现这三种方法,即循环遍历通常属于这三种功能类别之一: Map:对每个项应用相同的步骤集,存储结果 Filter:应用验证条件,存储计算结果为 True 的项

Python 入门基础 一

偶尔善良 提交于 2020-04-07 15:21:41
主要是以Python 3.x 为开发环境 which python3 查看 linux及Mac下 python3是都安装以及程序的位置 终端打开python的时候,直接输入python3,打开的就是3.几的版本 变量 :字母 下划线 数字,第一个字符不能用数字 常量: 全部大写字母表示常量 变量定义的规则: 变量名只能是 字母、数字或下划线的任意组合 变量名的第一个字符不能是数字 以下关键字不能声明为变量名 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] hello,world 1 #!/usr/bin/env python3 2 # -*- coding: UTF-8 -*- 3 4 print"hello,world" 当行注释 #被注释内容 多行注释 '''被注释内容''' 1 name ='张三' 2 name2

弱题(循环矩阵)

余生颓废 提交于 2020-04-07 15:20:37
题目描述 有 M 个球,一开始每个球均有一个初始标号,标号范围为1~ N 且为整数,标号为 i 的球有 a i 个,并 保证 Σ a i = M 。 每次操作 等概率 取出一个球(即取出每个球的概率均为1/ M ),若这个球标号为 k ( k < N ),则将它重新标号为 k + 1;若这个球标号为 N ,则将其重标号为1。 (取出球后并不将其丢弃) 现在你需要求出,经过 K 次这样的操作后,每个标号的球的期望个数。 输入 第1行包含三个 正整数 N , M , K ,表示了标号与球的个数以及操作次数。 第2行包含 N 个 非负整数 a i ,表示初始标号为 i 的球有 a i 个。 输出 应包含 N 行,第 i 行为标号为 i 的球的期望个数,四舍五入保留3位小数。 f[i]表示标号为i的期望个数,f[i]=(m-1)/m*f[i]+1/m*f[i-1] 每轮结束后,f[i]只与上一轮的f[i]和f[i-1]有关 m-1/m 1/m 1/m m-1/m 1/m m-1/m 因为构造矩阵的每一行都和第一行有关系,所以每一次矩阵乘先乘出a[1][i]的结果,再用第一行a[1][i]去更新 2---n-1行 #include<iostream> #include<cstdio> #include<cstring> #define N 1005 using namespace std;

slice for 循环中删除元素

爷,独闯天下 提交于 2020-04-06 22:48:00
slice for 循环中删除元素 方法1 Golang Delete Slice Item in Range Problem chars := []string{"a", "a", "b"} for i := 0; i < len(chars); i++ { if chars[i] == "a" { chars = append(chars[:i], chars[i+1:]...) i-- // form the remove item index to start iterate next item } } fmt.Printf("%+v", chars) 方法二 Find and delete elements from slice in golang p := []int{1, -13, 9, 6, -21, 125} j := 0 for _, n := range p { if n >= 0 { p[j] = n j++ } } p = p[:j] 不改原slice p := []int{1, -13, 9, 6, -21, 125} j := 0 q := make([]int, len(p)) for _, n := range p { if n >= 0 { q[j] = n j++ } } q = q[:j] // q is copy with numbers

不要再认为Stream可读性不高了!

﹥>﹥吖頭↗ 提交于 2020-04-06 08:48:16
距离Java 8发布已经过去了7、8年的时间,Java 14也刚刚发布。Java 8中关于函数式编程和新增的Stream流API至今饱受“争议”。 如果你不曾使用Stream流,那么当你见到Stream操作时一定对它发出过鄙夷的声音,并在心里说出“这都写的什么玩意儿”。 如果你热衷于使用Stream流,那么你一定被其他人说过它 可读性不高 ,甚至在codereview时被要求改用for循环操作,更甚至被写入公司 不规范编码 中的案例。 这篇文章将告诉你, 不要再简单地认为Stream可读性不高了! 下面我将围绕以下举例数据说明。 这里有一些学生课程成绩的数据,包含了学号、姓名、科目和成绩,一个学生会包含多条不同科目的数据。 ID 学号 姓名 科目 成绩 1 20200001 Kevin 语文 90 2 20200002 张三 语文 91 3 20200001 Kevin 数学 99 4 20200003 李四 语文 76 5 20200003 李四 数学 71 6 20200001 Kevin 英语 68 7 20200002 张三 数学 88 8 20200003 张三 英语 87 9 20200002 李四 英语 60 场景一:通过学号,计算一共有多少个学生? 通过学号对数据去重,如果在不借助Stream以及第三方框架的情况下,应该能想到通过 Map的key键不能重复

for...of循环

亡梦爱人 提交于 2020-04-06 06:45:53
for of 循环语句 for...of 循环语句 ES6 为实现了迭代器接口的数据提供了统一访问访机制:新增了一个循环语句 — for...of 循环语句;该语句会自动寻找 Iterator 接口。所以数据只要实现了 Iterator 接口,该数据就是可以被遍历的;该接口默认部署在 Symbol.iterator 属性上 原生的数据实现了迭代器接口的有: Array , String , Map , Set , TypedArray (如 Int8Array ), arguments , NodeList , HTMLCollection 等 // 字符串迭代器接口 console.log(String.prototype[Symbol.iterator]) //类数组 迭代器 let arr = new Int8Array(4) arr[0] = 10 arr[1] = 100 // arr[2] = 1000 arr[2] = 2 ** 7 - 1 console.log(arr) //参数 function demo() { console.log(arguments) } demo() console.log(document.getElementsByTagName('div')); console.log(document.querySelectorAll('div'

【CSAPP笔记】10. 代码优化

谁说我不能喝 提交于 2020-04-06 05:48:09
写程序的主要目标是使它在所有可能的情况下都能正确运行(bug free),一个运行得很快但有 bug 的程序是毫无用处的。在 bug free 的基础上,程序员必须写出清晰简洁的代码,这样做是为了今后检查代码或修改代码时,其他人能够读懂和理解代码。另一方面,让程序运行得更快也是一个很重要的考虑因素。不过,程序获得最大加速比的时候,是它第一次运行起来的时候。 在提到优化程序性能时(Code optimization),我们往往会想到算法与数据结构中的一个概念——复杂度。事实上,除了算法复杂度之外,仍然有许多的代码书写小细节可以改进性能表现。不过,编写高效的程序,第一个考虑的还是选择一组合适的算法与数据结构,因为算法复杂度影响还是相当大的,而且通常比其他常量因素更重要。第二点,我们必须写出编译器能够有效优化以转换成高效可执行代码的源代码。对于第二点,理解程序是如何被编译和执行、理解处理器和存储器系统是如何运作的、理解编译器优化的局限性是很重要的。在程序开发过程中,程序员必须在实现和维护程序的简单性与它的运行速度之间做出权衡,也就是在尽量不破坏程序的模块化和通用性的前提下,做到对代码性能的优化。 即使是最好的编译器也受到 妨碍优化的因素 (optimization blocker)的阻碍,程序员必须编写容易优化的代码,来 帮助 编译器(很让人眼界一新的观点)。研究程序的汇编代码

C语言编程优化运行速度

混江龙づ霸主 提交于 2020-04-06 04:02:18
1、选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。 数组索引 指针运算 For(;;){ p=array A=array[t++]; for(;;){ a=*(p++); 。。。。。。。。。 。。。。。。 } } 指针方法的优点是, array 的地址每次装入地址 p 后,在每次循环中只需对 p 增量操作。在数组索引方法中,每次循环中都必须根据 t 值求数组下标的复杂运算。 2、使用尽量小的数据类型 能够使用字符型 (char) 定义的变量,就不要使用整型 (int) 变量来定义;能够使用整型变量定义的变量就不要用长整型 (long int) ,能不使用浮点型 (float) 变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值, C 编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。 在

c语言中的代码优化《转》

痴心易碎 提交于 2020-04-06 03:03:44
在性能优化方面永远注意80-20原则,即20%的程序消耗了80%的运行时间,因而我们要改进效率,最主要是考虑改进那20%的代码。不要优化程序中开销不大的那80%,这是劳而无功的。 第一招:以空间换时间   计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!"); 方法B: const char string2[LEN] ="This is a example!"; char * cp; cp = string2 使用的时候可以直接用指针来操作。 从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活 性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执 行的高效率。 如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。 第二招: 使用宏而不是函数。   这也是第一招的变招

for循环、for...in循环和forEach循环区别

徘徊边缘 提交于 2020-04-04 14:41:15
1.for循环:是应用最广泛的的循环形式,适用于已知循环次数的场景。 优点:可以控制循环起始和结束。 语法:for ( 定义变量并赋值;判断条件;步长 ){ 循环体; }    2.forEach循环:是一种专门用于针对数组的循环遍历。 语法:数组变量.forEach( function( 参数1,参数2,参数3 ){   循环体; } ); 参数1:存储数组的单元数据; 参数2:存储数组单元索引; 参数3:存储原始数据。 注:参数名称可以任意定义,参数个数根据需求定义。 例: 输出结果: 3.for...in循环:数组、对象都可以使用的循环。 语法: for( var 自定义变量 in 数组/对象 ){   循环体; } 自定义变量:存储数组/对象,索引下标/键名。 注:自定义变量存储的是字符串类型,执行数学运算时需要进行转化。 例: 输出结果: 总结:1.针对数组,3种方法都可以使用,推荐使用forEach循环,简单方便;    2.for...in循环一般较多使用在对象中;    3.for循环在需要控制循环的起始和结束时候使用。 来源: https://www.cnblogs.com/zhanglei154636/p/12631335.html