闭包

Swift 5 闭包Closure简明教程

天涯浪子 提交于 2020-01-09 13:28:39
系统: Mac OS 10.15.2, XCode 11.3,swift 5.0 写作时间:2020-01-09 说明 Swift中的闭包(Closure) ,闭包的地位等同于OC中的Block! Objc 闭包的写法 void ( ^ printBlock ) ( NSString * x ) ; printBlock = ^ ( NSString * str ) { NSLog ( @ "print:%@" , str ) ; } ; printBlock ( @ "hello world!" ) ; Swift 闭包 的写法 // 定义语法 //{ // (参数列表) ->返回值类型 in // 语句组 //} // 声明一个闭包(有两个整形参数,且返回值为整形的闭包) var sumClosure : ( ( a : Int , b : Int ) - > Int ) // 实现闭包 sumClosure = { ( a : Int , b : Int ) - > Int in return a + b } // 调用 let sum = sumClosure ( a : 10 , b : 20 ) print ( sum ) Swift 闭包重定义 // 有参数无返回值的 typealias Myclosure1 = ( str : String ) - > Void /

build.gradle 详解

寵の児 提交于 2020-01-08 19:20:53
简述:   1) Java 开发中有两个大名鼎鼎的项目构建 ANT、Maven。   2) Google 推荐使用的 Android studio 是采用 Gradle 来构建项目。Gradle 是一个非常先进的项目构建工具。   Gradle 是用了一种基于 Groovy 的领域特定语言(DSL,Demain Specific Language)来声明项目设置,摒弃了 XML(如 ANT 和 Maven)的各种繁琐配置。   3) 项目中一般会出现2个或者多个 build.gradle 文件,一个在根目录下,一个在 app 目录下。   如果切换到 Android 模式下则全部在 Gradle Scripts。 1. 根目录下的 build.gradle   1) repositories 闭包,声明了 jcenter() 的配置;   2) dependencies 闭包,声明了一个 Gradle 插件。 buildscript { repositories { //repositories闭包 google() jcenter() //代码托管库:设置之后可以在项目中轻松引用jcenter上的开源项目 } dependencies { //dependencies闭包 classpath 'com.android.tools.build:gradle:3.0.0' ///

函数 闭包

荒凉一梦 提交于 2020-01-07 21:52:04
function a() { function b() { var bbb = 234; console.log(aaa); } var aaa = 123; return b; } var glob = 100; var dome = a(); dome(); function test() { var num = 100; function a() { num++; console.log(num); } function b() { num--; console.log(num); } return [a, b] } var myArr = test(); myArr[0](); //101 myArr[1](); //100 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取 局部变量 ,所以闭包可以理解成“定义在一个 函数 内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 来源: https://www.cnblogs.com/punisher999/p/12163770.html

3.装饰器与闭包

若如初见. 提交于 2020-01-07 15:37:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ###刚刚遇到装饰器与闭包问题,这个有个小区分 闭包一 def count_outter(): L = [] def count_inner(): for i in range (1,5): L.append(i) return L return count_inner a = count_outter() print(a) print(a()) 结果 <function count_outter.<locals>.count_inner at 0x10137a9d8> [1, 2, 3, 4] 闭包二 def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() 结果 >>> f1() 9 >>> f2() 9 >>> f3() 9 闭包三 def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs 结果 >>> f1, f2, f3 = count()

Python核心编程

瘦欲@ 提交于 2020-01-02 01:09:55
模块循环导入问题 深拷贝和浅拷贝 位运算 获取私有属性的值 property的使用 迭代器 闭包 装饰器 python动态添加属性以及方法 生成器 1.模块循环导入问题 #vi a.py from b import b def a(): print('-----a-----') b() a() #vi b.py from a import a def b(): print('-----b-----') def c(): print('------c-----') a() c() #python3 a.py的结果是:ImportError:cannot import name 'a' 解决办法:不要互相调用,另外写个 主模块 去调它们(子模块) 2.深拷贝与浅拷贝 #浅拷贝 a = [11,22,33] b = a id(a) == id(b) #True #深拷贝 a = [11,22,33] import copy c = copy.deepcopy(a) id(a) == id(b) #False #copy与deepcopy的区别 copy只拷贝第一层引用;deepcopy是递归拷贝所有引用 当copy遇到元组时,会进行浅拷贝(只指向) 3.位运算 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 按位左移 >> 按位右移 用途:直接操作二进制,省内存,效率高 按位移

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

北战南征 提交于 2020-01-02 01:09:13
生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: 执行效果如下: 可以看到没有任何的结果输出,这说明程序已经可以顺利执行。对于迭代器来讲需要用next()方法来获取值,修改主函数为以下情况可以打印输出前4个整数的立方数: 输出结果如下: 到此可以看到,生成器生成的值需要使用next()方法一个一个的取,它不会一次性生成所有的计算结果,只有在取值时才调用,这时程序会返回计算的一个值且程序暂停;下一次取值时从上一次中断了的地方继续往下执行。 以取出前3个值为例,下图为生成器代码解析图: 图解

Python核心编程的四大神兽

ε祈祈猫儿з 提交于 2020-01-02 01:08:50
本文将主要分为4大部分,分别介绍Python核心编程中的迭代器、生成器 、闭包以及装饰器。 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: def lifang_ls(): """求1-10所用整数的立方数-列表方式实现""" ls = [] for i in range(1,11): result = i ** 3 ls.append(result) print(ls) if __name__ == '__main__': lifang_ls() 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: def lifang_generate(): """求1

编程范式

China☆狼群 提交于 2020-01-01 12:27:08
编程语言有很多种流派和思想,有一些编程语言同时支持多种编程范式。 静态类型编程范式 采用静态类型编程范式的编程语言,其变量需要明确指定类型。代表语言有C、C++、Pascal、Objective-C、Java、C#、VB、.NET、Swif和Golang等。 这种范式认为,程序员肯定知道变量的类型,你丫要是不知道变量的类型,那你就别混了!编译时,如果变量类型对应不上,程序就会报错。 静态类型的好处 1.编译器可以在编译时就能找出类型错误。 2.编译器编译时知道类型信息,就可以提高性能。 此外,Swift和Go语言虽然都是静态类型编程语言,但它们都不需要明确指定类型,而是可以通过推断由编译器自动确定其类型。 动态类型编程范式 采用静态类型编程范式的编程语言,其变量不需要明确指定类型。任意变量,可以指向任意类型的对象。代表语言有Python、Ruby和JavaScript。 动态类型的哲学可以用鸭子类型(Ducktyping)这个概念来概括。JamesWhitcombRiley提出的鸭子测试可以这样表述:当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 这种范式认为,程序员肯定知道变量的类型和它支持的方法和属性,你丫要是不知道变量的类型,那你就别混了!运行时程序会崩溃!程序崩溃怨谁?怨你自己呗,你不是合格的程序员! 动态类型的好处

Golang源码探索(二) 协程的实现原理

左心房为你撑大大i 提交于 2019-12-31 22:04:19
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是 G , M 和 P , 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用 go 关键词创建. 举例来说, func main() { go other() } , 这段代码创建了两个goroutine, 一个是main, 另一个是other, 注意main本身也是一个goroutine. goroutine的新建, 休眠, 恢复, 停止都受到go运行时的管理. goroutine执行异步操作时会进入休眠状态, 待操作完成后再恢复, 无需占用系统线程,

《数据库系统原理与设计》第五章:关系数据理论详细思路笔记

六眼飞鱼酱① 提交于 2019-12-30 02:42:38
函数依赖 这一章主要详细解读了数据库中不同属性之间的关系,其中最基础的就是函数依赖关系。 通俗地来讲就是,由一个属性集合(内含一个或多个属性,暂时不考虑空集情况)可以推出另外属性集合(内含一个或多个属性)。 所谓的“推出”这种关系也就是当前者集合内所有元素被确定的时候,后者集合内所有元素内容也能唯一确定(类比代数学中的“函数”)。 也就是我们说,后者依赖前者。 特殊的依赖关系 首先是 平凡 依赖,自己依赖自己,这是总成立的所以称为平凡。 这个“函数”的自变量是一个集合,可以存在多余的属性,许多特殊的关系都是由于这一点产生的。比如当自变量合集中多出至少一个属性,对于这个依赖关系而言,后者对前者就属于 部分依赖 ,而多余的属性则称为 无关属性 ,属于 右无关 ,左无关后续会分析。 传递 与 直接 依赖也很好理解,中间经过多次或一次“推出”关系。 关系模式与闭包 关系模式的本质是一个属性集合与一个依赖关系集合。其中依赖关系集合可以通过关系代数逻辑运算得到新的依赖关系。对于一个给定的依赖集合,把所有能被运算得到的依赖组成一个新依赖集合,就能被称为原集合的 依赖集闭包 。但事实上对于实际问题一般我们并不需要依赖集闭包中的所有关系,而且一般依赖集闭包内容极其庞大且绝大多数作用有限,更多时候仅作为描述时的概念。所以更多地我们使用 属性集闭包 给定几个属性组成原属性集