06 PHP基本语法 — 条件、循环、函数 杨亮 《PHP语⾔程序设计》PHP基本语法 —条件、循环、函数 杨亮 程序的基本结构 输⼊入 输出 程序 运算(+ - x / & | ! …) 逻辑(条件、循环、递归) 辅助(变量、数组、函数) ⼩小测验 ⽤用你熟悉的程序找出 1~1000中的所有质数 我们直接看代码好了 1 函数库,或者代码⽚片段 1 '; 4 ?> 1 函数 • 代码的可读性 • 代码的可重⽤用性 • 实现功能的模块化 • 实现递归调⽤用 • 使变量名不⾄至于太⻓长(作⽤用域) PHP中的函数 $res = my_function($val1, $val2); functon my_function($param10 码力 | 25 页 | 1.30 MB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第三课 函数, 列表与递归现代编程思想 函数, 列表与递归 Hongbo Zhang 1 基本数据类型:函数 2 函数 在数学上,描述对应关系的⼀种特殊集合 对于特定的输⼊,总是有特定的输出 在计算机中,对相同运算的抽象,避免⼤量重复定义 计算半径为1的圆的⾯积: 3.1415 * 1 * 1 计算半径为2的圆的⾯积: 3.1415 * 2 * 2 计算半径为3的圆的⾯积: 3.1415 * 3 * * 3 …… fn ⾯积(半径: Double) -> Double { 3.1415 * 半径 * 半径 } 3 函数 计算半径为1、2、3的圆的⾯积: 1. let surface_r_1: Double = { let r = 1.0; pi * r * r } 2. let surface_r_2: Double = { let r = 2.0; pi * r * r } 3. let surface_r_3) 使⽤函数后 1. fn area(radius: Double) -> Double { pi * radius * radius } 2. let result = (area(1.0), area(2.0), area(3.0)) 4 顶层函数的定义 fn <函数名> (<参数名>: <类型>, <参数名>: <类型>, ...) -> <类型> <表达式块> 定义的函数接⼝让其他使⽤者⽆需关注内部实现0 码力 | 42 页 | 587.59 KB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第六课 泛型与高阶函数现代编程思想 泛型与⾼阶函数 Hongbo Zhang 1 设计良好的抽象 软件⼯程中,我们要设计良好的抽象 当代码多次重复出现 当抽出的逻辑具有合适的语义 编程语⾔为我们提供了各种抽象的⼿段 函数、泛型、⾼阶函数、接⼝…… 2 泛型函数与泛型数据 3 堆栈 栈是⼀个由⼀系列对象组成的⼀个集合,这些对象的插⼊和删除遵循后进先出原则 (Last In First Out) } 12. } 我们希望存储很多很多类型在堆栈中 每个类型都要定义⼀个对应的堆栈吗? IntStack 和 StringStack 似乎结构⼀模⼀样? 7 泛型数据结构与泛型函数 泛型数据结构与泛型函数以类型为参数,构建更抽象的结构 1. enum Stack[T] { 2. Empty 3. NonEmpty(T, Stack[T]) 4. } 5. fn Stack::empty[T]() 泛型数据结构与泛型函数 我们⽤ [<类型1>, <类型2>, ...] 来定义泛型的类型参数 enum Stack[T]{ Empty; NonEmpty(T, Stack[T]) } struct Pair[A, B]{ first: A; second: B } fn identity[A](value: A) { value } Stack 与 Pair 可以看做从类型上的函数:类型构造器0 码力 | 27 页 | 2.56 MB | 1 年前3
Idris 语言文档 Version 1.3.1H AP T E R 1 I d r i s 教程 本文档为 奉 奤 奲 奩 女 的教程,它简单介绍了如何用 奉 奤 奲 奩 女 语言编程。 文档中覆盖了该语言的核心特性,并假 定你至少熟悉一门函数式编程语言,如 奈奡女 奫 奥 奬 奬 或 奏 奃 奡奭 奬 。 注 注 注解 解 解: 奉 奤 奲 奩 女 文档已按照 创 创 创作 作 作共 共 共用 用 用 C C 0 许 许 许可 可 可协 Vect n a, 其中 a 为元素的类型,而 n 为该列表的长度且可以任意 长。 当类型包含了描述其性质的值(如列表的长度)时,它就能描述函数自身的性质了。 比如连接两个列 表的操作,它拥有性质:结果列表的长度为两个输入列表的长度之和。 因此我们可以为 app 函数赋予 如下类型,它用于连接向量(奖奥 奣 奴 奯奲 ): app : Vect n a -> Vect m a -> Vect (n + 本教程介绍了 奉 奤 奲 奩 女 ,一个通用的依赖类型函数式编程语言。奉 奤 奲 奩 女 项目旨在为可验证的通用编程打造一 个依赖类型的语言。 为此,奉 奤 奲 奩 女 被设计成了编译型语言,目的在于生成高效的可执行代码。 它还拥有 轻量的外部函数接口,可与外部 C 库轻松交互。 1. 1. 1 目 目 目标 标 标受 受 受众 众 众 本教程面向已经熟悉函数式语言(如 奈奡女 奫 奥 奬 奬 或 奏 奃0 码力 | 224 页 | 2.06 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 INode 一切节点的公共基类。 多态的经典案例 • IObject 具有一个 eatFood 纯虚函数,而 CatObject 和 DogObject 继承自 IObject ,他 们实现了 eatFood 这个虚函数,实现了多态。 • 注意这里解构函数( ~IObject )也需要是虚函数 ,否则以 IObject * 存储的指针在 delete 时只 会释放 IObject 里的成员,而不会释放 m_catFood 。所以 这里的解构函数也是多态的,他根据类型的不同 调用不同派生类的解构函数。 多态用于设计模式之“模板模式” • 这样之后如果有一个任务是要基于 eatFood 做文章,比如要重复 eatFood 两遍。 • 就可以封装到一个函数 eatTwice 里,这个函数只需接受他们共同的基类 IObject 作为参数,然后调 用 eatFood 这个虚函数来做事(而不是直接操作具体的猫和狗本身)。 dont-repeat-yourself ), 也让函数的作者不必去关注点从猫和狗的其他具体细节,只需把握住他们统一具有的“吃”这个接口。 小知识: shared_ptr 如何深拷贝? 浅拷贝: 深拷贝: 思考:能不能把拷贝构造函数也作为虚函数? • 现在我们的需求有变,不是去对同一个对象调用两次 eatTwice ,而是先把对象复制一份 拷贝,然后对对象本身和他的拷贝都调用一次 eatFood 虚函数。 • 代码如下0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming是你渐渐意识到,被烫伤是个小概率事件,所以你“预判”到今天应该也不会发生意外,不再 等待烧完开水才开始刷牙,而是针对性地为“没烫伤”的那个剧本优化。把刷牙、看比站和烧 开水同时进行,但刷牙、看比站在烧完开水前都处于“虚”的状态,也就是虽然在做但是不写 到日记里(提前执行数学计算,但不实际写回数据到内存)。直到烧完开水确认没有被烫伤 后,才实际把刷牙、看比站的操作写到日记本里( CPU 确认执行这条分支,才会真正写回 以上时,对于只有两个分支的 if- else ,编译器往往会自动检测到可以优化,帮你应用 “妙用加减乘”了,无法体现手动优化的意义。 • 注:此处采用函数指针不仅是为了重用代码,也可以 避免 clamp 被编译器自动内联到 test 函数体内。 • 微软编译器的同学,要把 __attribute__((noinline)) 换成 __declspec(noinline) 才能编译。 不同写法的性能测试 EDOM ,产生副作用。而原先的三目运算 符 ?: 由于具有“短路”特性,当 x < 0 时第一个分支 sqrt(x) 不会执行,没有副作用。不一 样了! • 总之,对于这种有副作用的函数,或是有可能返回 NaN 的函数,无法“妙用加减乘”优化 。 冷静分析,学会变通 • return x >= 0 ? sqrt(x) : 0; • 但是我们可以变通一下,既然从返回值优化不行,从参数入手怎样?首先已知0 码力 | 47 页 | 8.45 MB | 1 年前3
Object Pascal 参考手册(Ver 0.1) end. Unit1 单元定义一个叫做 PrintMessage 的过程,它接收一个字符串作为参数,并把它送到标准输 出设备(在 Pascal 中,没有返回值的例程叫过程,有返回值的例程叫函数)。请注意,PrintMessage 在 Unit1 中声明了两次,第一次是在关键字 interface 的下面,这使得它对于引用 Unit1 单元的其它 模块(比如 Greeting)是可用的;第二次声明是在关键字 TServiceApplication 的一个实例)。块也可以包含常量、类型、变量、过程和函数的声明,它们必须位于(块中)命令语句的 前面。 Unit structure and syntax(单元的结构和语法) Unit structure and syntax: Overview(概述) 一个单元由类型(包括类)、常量、变量以及例程(函数和过程)构成,每个单元由它自己的单元文 件(.pas)定义。 一个单元以单元头(unit 开始,直到实现部分的开头。接口部分声明常量、类型、变 量、过程和函数,所有这些对单元的客户(也就是引用此单元的程序或其它单元)是可用的。在接口部 分声明的实体被称为‘公用’的,因为它们对客户来说,就像自己声明的一样。 在接口部分声明的过程或函数只是一个例程头,它们的代码块(block)在实现部分定义。所以,在 接口部分声明过程和函数就像使用 forward 指示字,虽然这里它并没有出现。 在0 码力 | 168 页 | 868.25 KB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20. . . . . . . . . . . . . . . . . . . . . 30 显式虚函数重载 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 显式禁用默认函数 . . . . . . . . . . . . . . . . . . . . . . . . Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.2 函数对象包装器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 std::function 不仅仅增强了 C++ 语言自身的可用性,auto 关键字语义的修改使得我 们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出 现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 Python/Swift/. . . )中已经司空见惯,右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。 C++170 码力 | 83 页 | 2.42 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 GPU 专题) 为什么需要模板函数( template ) • 避免重复写代码。 • 比如,利用重载实现“将一个数乘以 2” 这个 功能,需要: 为什么面向对象在 HPC 不如函数式和元编程香了? 这个例子要是按传统的面向对象思想,可能是这样: 令 Int, Float, Double 继承 Numeric 接口类并实现 ,其中 multiply(int) 作为虚函数。然后定义: Numeric 几个,然后每个运算符都要声明一个纯虚函数吗? 而且, Float 的乘法应该是 multiply(float) ,你也去 定义好几个重载吗?定义为 multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理,后半段主要介绍并行编程与优化。 1.课程安排与开发环境搭建: cmake 与 git 入门 2.现代 C++ 入门:常用 STL 容器, RAII 内存管理 3.现代 C++ 进阶:模板元编程与函数式编程 4.编译器如何自动优化:从汇编角度看 C++ 5.C++11 起的多线程编程:从 mutex 到无锁并行 6.并行编程常用框架: OpenMP 与 Intel TBB 7.被忽视的访存优化:内存带宽与 zhihu.com/p/350068132 未来: C++20 引入模块( module ) https://zhuanlan.zhihu.com/p/350136757 未来: C++20 允许函数参数为自动推断( auto ) 未来: C++20 引入协程( coroutine )和生成器( generator ) 未来: C++20 标准库加入 format 支持 跑远了! • 鉴于 这种情况出现时,就意味着你需要把成员变量的读写封装为成员函数 不变性:请勿滥用封装 • 仅当出现“修改一个成员时,其他也成员要 被修改,否则出错”的现象时,才需要 getter/setter 封装。 • 各个成员之间相互正交,比如数学矢量类 Vec3 ,就没必要去搞封装,只会让程序员 变得痛苦,同时还有一定性能损失:特别 是如果 getter/setter 函数分离了声明和定 义,实现在另一个文件时!0 码力 | 96 页 | 16.28 MB | 1 年前3
共 447 条
- 1
- 2
- 3
- 4
- 5
- 6
- 45













