Python基础-函数篇
本节内容
1. 函数基本语法及特性
2. 参数与局部变量
3. 返回值
嵌套函数
4.递归
5.匿名函数
6.函数式编程介绍
7.高阶函数
8.内置函数
函数与函数式编程
1、面向对象: 华山派---->类----> class
2、面向过程: 少林派---->过程---->def
3、函数式编程:逍遥派---->函数---->def
函数与函数式编程
1.介绍:
在过去的十年间,大家广为熟知的编程方法无非两种:面向对象和面向过程,其实,无论哪种,都是一种编程的规范或者是如何编程的方法论。而如今,一种更为古老的编程方式:函数式编程,以其不保存状态,不修改变量等特性重新进入人们的视野。下面我们就来依次了解这一传统的编程理念,让我们从基本的函数概念开始。
2.函数定义:
初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域,编程语言中函数定义:函数是逻辑结构化和过程化的一种编程方法。
函数定义规范
def:定义函数的关键字
test:函数名
():内可定义形参
"":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
x+=1:泛指代码块或程序处理逻辑
return:定义返回值
补充:
函数式编程就是:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。至于具体如何实现和这么做的好处,后续我会详细介绍。
ps:
python中函数定义方法:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige #函数
def func1():
'''testing'''
print('in the func1')
return 0 #过程
def func2():
'''testing'''
print('in the func2') x=func1()
y=func2() print('from func1 return is %s' %x)
print('from func2 return is %s' %y)
执行结果:
in the func1
in the func2
from func1 return is 0
from func2 return is None
3.为何使用函数:
没有函数的编程只是在写逻辑(功能),想脱离函数,重用你的逻辑,唯一的方法就是拷贝
例一:
假设我们编写好了一个逻辑(功能),用来以追加的方式写日志:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige #假设我们编写好了一个逻辑(功能),用来以追加的方式写日志:
with open('a.txt','a+') as f:
f.write('end action') #现在有三个函数,每个函数在处理完自己的逻辑后,都需要使用上面这个逻辑,那么唯一的方法就是,拷贝三次这段逻辑
def test1():
print('in the test1')
with open('a.txt','a+') as f:
f.write('end action') def test2():
print('in the test2')
with open('a.txt','a+') as f:
f.write('end action') def test3():
print('in the test3')
with open('a.txt','a+') as f:
f.write('end action') test1()
test2()
test3() #那么假设有>N个函数都需要使用这段逻辑,你可以拷贝N次吗?
执行结果:
in the test1
in the test2
in the test3
接着会生成一个a.txt的文件,里面内容如下:
end action
end action
end action
例二:
优化后的代码,用函数的方法来实现
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige #假设我们编写好了一个逻辑(功能),用来以追加的方式写日志: #下面用函数的方法来实现
def logger():
with open('a.txt','a+') as f:
f.write('end action\n') def test1():
print('in the test1') logger()
def test2():
print('in the test2') logger() def test3():
print('in the test3') logger() test1()
test2()
test3()
执行结果:
in the test1
in the test2
in the test3
接着会生成一个a.txt的文件,里面内容如下:
1 end action
2 end action
3 end action
例三:
需求变了(让我们来为日志加上时间吧)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige #假设我们编写好了一个逻辑(功能),用来以追加的方式写日志:
#下面用函数的方法来实现 import time
def logger():
time_format='%Y-%m-%d %X'
time_current=time.strftime(time_format)
with open('a.txt','a+') as f:
f.write('%s end action\n' %time_current) def test1():
print('in the test1') logger()
def test2():
print('in the test2') logger() def test3():
print('in the test3') logger() test1()
test2()
test3()
执行结果:
in the test1
in the test2
in the test3
接着会生成一个a.txt的文件,里面内容如下:
2016-11-15 15:55:56 end action
2016-11-15 15:55:56 end action
2016-11-15 15:55:56 end action
总结例二和例三可概括使用函数的三大优点
1.代码重用
2.保持一致性
3.可扩展性
4.函数和过程:
过程定义:过程就是简单特殊没有返回值的函数
这么看来我们在讨论为何使用函数的的时候引入的函数,都没有返回值,没有返回值就是过程,没错,但是在python中有比较神奇的事情
def test01():
msg='hello The little green frog'
print msg def test02():
msg='hello WuDaLang'
print msg
return msg t1=test01() t2=test02() print 'from test01 return is [%s]' %t1
print 'from test02 return is [%s]' %t2
总结:当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,
所以在python中即便是过程也可以算作函数。
5.函数返回值:
ps1:
def test1():
print('in the test1')
return 0
print('test end') test1()
执行结果:
in the test1
ps2:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test1():
print('in the test1')
return 0 x=test1()
print(x)
执行结果:
0
ps3:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test1():
print('in the test1') def test2():
print('in the test2')
return 0 def test3():
print('in the test3')
return 1,'hello',['alex','wupeiqi'],{'name':'alex'} x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z)
执行结果:
in the test1
in the test2
in the test3
None
0
(1, 'hello', ['alex', 'wupeiqi'], {'name': 'alex'})
总结:
返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple (元组)
ps4:
def test01():
pass def test02():
return 0 def test03():
return 0,10,'hello',['alex','lb'],{'WuDaLang':'lb'} t1=test01()
t2=test02()
t3=test03() print 'from test01 return is [%s]: ' %type(t1),t1
print 'from test02 return is [%s]: ' %type(t2),t2
print 'from test03 return is [%s]: ' %type(t3),t3
总结:
返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple
说明一下return可以返回任何参数?
答案是可以的
ps:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test1():
print('in the test1') def test2():
print('in the test2')
return 0 def test3():
print('in the test3')
# return 1,'hello',['alex','wupeiqi'],{'name':'alex'}
return test2 #可以return任何值,返回的是内存地址 x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z)
执行结果:
in the test1
in the test2
in the test3
None
0
<function test2 at 0x01C34C90> #返回的是内存地址
6.函数调用:
调用方法:
1.test()执行,()表示调用函数test,()内可以有参数也可没有
参数:
1.形参和实参
形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(记住:实参个数,类型应与实参必须一一对应,不能超,否则会报错)
实参:实际参数,调用函数时传给函数的参数,可以是常量,变量,表达式,函数,传给形参
区别:形参是虚拟的,不占用内存空间,.形参变量只有在被调用时才分配内存单元,实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参
形参和实参示例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,y):
print(x)
print(y) test(1,2)
执行结果:
1
2
实参和形参必须一一对应,不能超否则会报错。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,y):
print(x)
print(y) test(2,1,3)
执行结果:
1 Traceback (most recent call last):
2 File "D:/python/day4/func_test5.py", line 9, in <module>
3 test(2,1,3)
4 TypeError: test() takes 2 positional arguments but 3 were given
2.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)
ps1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,y):
print(x)
print(y) test(y=2,x=1)
执行结果:
1
2
ps2:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,y,z):
print(x)
print(y)
print(z) #test(y=2,x=1) #与形参顺序无关
#test(1,2) #与形参一一对应 #test(x=2,3) #错误用法,会报错
#test(3,x=2) #错误用法,会报错,先给了x一个3,又给了一个2,y就变得没有值了,所以报错了。
#test(3,y=2) #即有关键字调用,又有位置参数调用,按照位置参数的来。
#test(3,y=2,6) #注意:关键参数,不能写在位置参数前面。 test(3,6,z=2)
执行结果:
3
6
2
3.默认参数
ps1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,y=2): print(x)
print(y) test(1,y=3) #默认参数特点:调用函数的时候,默认参数非必须传递
执行结果:
1
3
ps2:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,soft1=True,soft2=True):
print(x)
test(1,3) #默认参数特点:调用函数的时候,默认参数非必须传递
#用途:1、默认安装值
执行结果:
1
ps3:
连接mysql数据库,设置固定值
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def conn(host,prot=3306):
pass conn()
4.参数组
ps1:
传值的时候,不能多,可以少,最少不能少于print的值(这里是2个),否则会报错
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test(x,y,z=2):
print(x)
print(y) test(1,2)
#test(1,2,3) #传值的时候,不能多,可以少,最少不能少于print的值(这里是2个),否则会报错
执行结果:
1
2
ps2:
多个实参,放到一个元组里面,以*开头,可以传多个参数
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige #多个实参,放到一个元组里面,以*开头,可以传多个参数
#*代表接受的参数不固定
def test(*args):
print(args) test(1,2,3,4,5,6)
test(*[1,2,4,5,6]) #args=tuple([1,2,3,4,5,6])
执行结果:
(1, 2, 3, 4, 5, 6)
(1, 2, 4, 5, 6)
ps3:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige #位置参数传值的时候不参超
def test1(x,*args):
print(x)
print(args) test1(1,2,3,4,5,6,7)
执行结果:
1
(2, 3, 4, 5, 6, 7)
ps4:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige # **kwargs把N个关键字参数,转换为字典的方式
def test2(**kwargs):
print(kwargs) test2(name='alex',age=8,sex='F')
执行结果:
{'sex': 'F', 'name': 'alex', 'age': 8}
ps5:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige # **kwargs把N个关键字参数,转换为字典的方式
def test2(**kwargs):
print(kwargs)
print(kwargs['name'])
print(kwargs['age'])
print(kwargs['sex']) test2(name='alex',age=8,sex='F')
执行结果:
{'age': 8, 'sex': 'F', 'name': 'alex'}
alex
8
F
ps6:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test4(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs) test4('alex',age=34,sex='m',hobby='tesla')
执行结果:
alex
34
{'hobby': 'tesla', 'sex': 'm'}
ps7:
非固定参数
若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test4(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs) test4('alex',age=34,sex='m',hobby='tesla')
执行结果:
alex #传给name
34 #age=34 传给age=18,并覆盖他的内容
{'hobby': 'tesla', 'sex': 'm'} # 传给字典 sex='m',hobby='tesla'
ps8:
用函数调用的方法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def test4(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs) def logger(source): #用函数调用的方法
print("from %s" % source) test4('alex',age=34,sex='m',hobby='tesla')
执行结果:
alex
34
{'hobby': 'tesla', 'sex': 'm'}
全局与局部变量
局部变量
ps1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def change_name(name):
print("before change",name)
name="Alex li" #这个函数就是这个变量的作用域(只在局部生效)
print('after change',name) name = "alex"
change_name(name)
print(name)
执行结果:
before change alex
after change Alex li
alex
全局变量
ps1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige school = "Oldboy edu." #全局变量 def change_name(name):
global school #声明(必须先声明,才能把Oldboy改成Mage Linux。大家忘记这种方法吧! 记住这句话:不应该在函数里面改全局变量)
school = "Mage Linux"
print("before change",name,school)
name="Alex li" #这个函数就是这个变量的作用域(只在局部生效)
age =23
print("after change",name) name = "alex"
change_name(name)
print(name)
print("school:",school)
执行结果:
before change alex Mage Linux
after change Alex li
alex
school: Mage Linux #声明后就把Oldboy 改成了Mage Linux
ps2:
#注意事项:只有字符串和单独的整数,不能在函数里面改。其它列表,字典,集合、类都可以在局部变量里面更改的。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige school = "Oldboy edu."
names = ["Alex","Jack","Rain"]
def change_name(): names[0] = "金角大王"
print("inside func",names) change_name()
print(names) #注意事项:只有字符串和单独的整数,不能在函数里面改。其它列表,字典,集合、类都可以在局部变量里面更改的。
执行结果:
inside func ['金角大王', 'Jack', 'Rain']
['金角大王', 'Jack', 'Rain']
递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
ps1:
def calc(n):
print(n)
if int(n/2) ==0:
return n
return calc(int(n/2)) calc(10)
执行结果:
10
5
2
1
ps2:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def calc(n):
print(n)
return calc(n+1)
calc(0) #最大递归999层
执行结果:
0
1
2
3
...... 中间省略
999 RecursionError: maximum recursion depth exceeded while calling a Python object
ps3:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def calc(n):
print(n)
if int(n/2) >0:
return calc(int(n/2))
print("->",n) calc(10)
执行结果:
10000000000
ps4:
阶乘 n! = n * (n-1) * (n-2) * ... * 2 * 1
阶乘拥有相同的子模式 n * (n-1)
随着运算的进行,乘数越来越少(问题规模递减)
当n=1时,运算结束(结束条件n=1)
如计算5!,则种子值为5
def factorial(n):
print(n)
if n == 1:
return n
else:
ret = n * factorial(n-1)
print(ret)
return ret
执行结果:
5
4
3
2
1
2
6
24
120
120
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
递归函数实际应用案例,二分查找
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset,find_num):
print(dataset) if len(dataset) >1:
mid = int(len(dataset)/2)
if dataset[mid] == find_num: #find it
print("找到数字",dataset[mid])
elif dataset[mid] > find_num :# 找的数在mid左面
print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
return binary_search(dataset[0:mid], find_num)
else:# 找的数在mid右面
print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
return binary_search(dataset[mid+1:],find_num)
else:
if dataset[0] == find_num: #find it
print("找到数字啦",dataset[0])
else:
print("没的分了,要找的数字[%s]不在列表里" % find_num) binary_search(data,66)
匿名函数
匿名函数就是不需要显式的指定函数
#这段代码
def calc(n):
return n**n
print(calc(10)) #换成匿名函数
calc = lambda n:n**n
print(calc(10))
你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
输出
1
25
49
16
64
函数式编程介绍
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。
ps:
y=2+4 y=f(2,4) 6 y=f(2,6) if x+y>7 return 0
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
一、定义
简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。
主要思想是把运算过程尽量写成一系列嵌套的函数调用。举例来说,现在有这样一个数学表达式:
(1 + 2) * 3 - 4
传统的过程式编程,可能这样写:
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:
var result = subtract(multiply(add(1,2), 3), 4);
这段代码再演进以下,可以变成这样
add(1,2).multiply(3).subtract(4)
这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函数式编程的代码更容易理解。
要想学好函数式编程,不要玩py,玩Erlang,Haskell,lisp 好了,我只会这么多了。。。
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige def add(a,b,f):
return f(a)+f(b) res = add(3,-6,abs) #6+3=9
print(res)
执行结果:
9
实现字符串转成字典功能
>>> b = ''' {
... 'bakend': 'www.oldboy.org',
... 'record':{
... 'server': '100.1.7.9',
... 'weight': 20,
... 'maxconn': 30
... }
... }'''
>>> b
" {\n 'bakend': 'www.oldboy.org',\n 'record':{\n 'server': '100.1.7.9',\n 'weight': 20,\n 'maxconn': 30\n }\n }"
>>> b[1]
'{'
>>> eval(b)
{'bakend': 'www.oldboy.org', 'record': {'weight': 20, 'maxconn': 30, 'server': '100.1.7.9'}}
>>> b=eval(b)
>>> b
{'bakend': 'www.oldboy.org', 'record': {'weight': 20, 'maxconn': 30, 'server': '100.1.7.9'}}
>>> b['record']
{'weight': 20, 'maxconn': 30, 'server': '100.1.7.9'}
Python基础-函数篇的更多相关文章
- python基础——函数的参数
python基础——函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复 ...
- python基础—函数嵌套与闭包
python基础-函数嵌套与闭包 1.名称空间与作用域 1 名称空间分为: 1 内置名称空间 内置在解释器中的名称 2 全局名称空间 顶头写的名称 3 局部名称空间 2 找一个名称的查找顺序: ...
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- Python基础-函数参数
Python基础-函数参数 写在前面 如非特别说明,下文均基于Python3 摘要 本文详细介绍了函数的各种形参类型,包括位置参数,默认参数值,关键字参数,任意参数列表,强制关键字参数:也介绍了调用函 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- Python 基础学习篇
注:技术尚浅,时间匆忙,如有错误或者不当之处值得商榷的,请留言,吾必思而改之. 第一篇 :Python基础- 安装/变量/输入/及循环语句使用 第二篇: Python基础- 常用数据类型 第三篇: ...
- Python 基础总结篇
变量及数据类型 Numbers数字分为:int整型,long长整型,float浮点型,complex复数 String字符串由数字.字母.下划线组成的一串字符,用于表示文本的数据类型 bool布尔型: ...
- Python之函数篇
函数形参 函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情.这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值. 参数在函数定义的圆括号对内 ...
随机推荐
- Canvas事件处理
鼠标事件 canvas.onmousedown = function(e ) {//React to the mouse down event }; canvas.addEventListener(' ...
- OpenXml入门---word里面插入图片
下面介绍如何在word里面插入图片,顺便小弟发现MSDN官网有完整的OpenXML教程,虽然是全英文的不过还是很有帮助的. Tips,原来摘抄代码里面没有模板,在copy过来发现插入word中的图片大 ...
- 第一篇使用Markdown的文章
一级标题 1 计算机 |计算机|科学| Foo 这段文字需要被强调 this is H1 ========== this is H2 ---------- 这是H1 这是H2 这是H3 这是H6 断好 ...
- 谈谈 Google 的 Test Certified
转载请联系作者,谢谢! 本文简单介绍下Google的Test Certified. Test Certified(后文简称TC)是Google内部的一个认证项目,在8年的时间里取得了多个里程碑,有17 ...
- 基于tiny6410的madplay播放器的移植
在移植madplay之前需要先将所需要的库移植到开发板的文件系统中. 现在每个解压后的文件夹中创建一个文件夹 zlib-1.1.4.tar.gz 解压:tar xvzf zlib-1.1.4.tar ...
- stl学习(二)集合 set 的使用
set集合容器底层由红黑树实现,是平衡二叉搜索树. 相对stl中的list.deque效率更高. 注意:由于集合 的 性质,单纯的 set 不允许重复的元素 初始化 / 清空 函数 : clear() ...
- ES6 WeakSet数据结构 与Set十分相似
它与Set十分相似,对象的值也不能是重复的,与Set不同点: .WeakSet成员只能够是对象. .作为WeakSet成员的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说, ...
- 利用scp 远程上传下载文件/文件夹和ssh远程执行命令
利用scp传输文件 1.从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如scp codinglog@192 ...
- Anterior and posterior commissures
Source: https://en.wikipedia.org/wiki/Posterior_commissure Figrues archive.
- AngularJS中的缓存
欢迎大家指导与讨论 : ) 缓存篇 一个缓存就是一个组件,它可以透明地储存数据,以便以后可以更快地服务于请求.多次重复地获取资源可能会导致数据重复,消耗时间.因此缓存适用于变化性不大的一些数据,缓存能 ...