每天进步一点点:Python中使用函数作为参数

在我的一个Python小脚本中,我有一个变态的需求,在一个函数中调用不同的函数,这个时候最简单的方法就是将待调用的函数作为参数传入。


(图源:bing.com

函数也是对象

之所以可以这样操作的原因是因为Python中一切皆是对象,举例说,我们可以定义个简单的函数并打印相关信息:

1
2
3
4
5
6
def add(x, y):
return x + y

print(add)
print(type(add))
print(id(add))

上述代码将输出类似如下信息:


3065566744

函数作为参数

有了上述分析,我们就可以大胆的将函数作为参数传入其它函数中了,下边我们实现了简单的加法(add)、减法函数(sub)。同时我们定义了一个函数计算(calc),这个函数接受一个函数以及其它两个参数。

1
2
3
4
5
6
7
8
9
10
11
def add(x, y):
return x + y

def sub(x, y):
return x - y

def calc(func, a, b):
return func(a, b)

print(calc(add, 1, 2))
print(calc(sub, 1, 2))

可见,我们可以通过调用calc函数,并指定用于进行计算的函数(add或者sub)来计算对应的数值。上述代码输入结果如下:

3
-1

函数参数的可变参数

上述例子中,我们直接在calc函数定义中指定了参数,并传递给其中的函数调用(add或sub),但是如果我们没法确定其内被调用的函数有多少个参数,或者有些参数是关键字参数,可怎么办呢?

答案是很简单的,我们只需将其传入到calc函数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def add(x, y):
return x + y

def add_more(x, y, z):
return x + y + z

def sub(x, y):
return x - y

def calc(func, *args, **kwargs):
return func(*args, **kwargs)

print(calc(add, 1, 2))
print(calc(sub, 1, 2))
print(calc(add_more, 1, 2, 3))
print(calc(add_more, x=1, y=2, z=3))

其中:

1
2
def calc(func, *args, **kwargs):
return func(*args, **kwargs)

第一句代表将位置参数打包给args(tuple类型),将关键字参数打包给kwargs(dict)类型。第二句函数调用括号内则代表将对应的数据解包。

将上述代码改进一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def add(x, y):
return x + y

def add_more(x, y, z):
return x + y + z

def sub(x, y):
return x - y

def calc(func, *args, **kwargs):
print(args)
print(kwargs)
return func(*args, **kwargs)

print(calc(add, 1, 2))
print()

print(calc(sub, 1, 2))
print()

print(calc(add_more, 1, 2, 3))
print()

print(calc(add_more, x=1, y=2, z=3))

结果如下:

(1, 2)
{}
3

(1, 2)
{}
-1

(1, 2, 3)
{}
6

()
{‘x’: 1, ‘y’: 2, ‘z’: 3}
6

Python 内置函数

在Python内置函数中,有几个函数使用了函数作为参数,比如:

  • map()
    map(function, iterable, ...)
  • filter()
    filter(function, iterable)
  • reduce()
    reduce(function, iterable[, initializer])

本文就不做深入介绍了。


This page is synchronized from the post: 每天进步一点点:Python中使用函数作为参数

刚刚,就是刚刚,STEEMIT肿么啦?

很多朋友可能会发现,从北京时间晚上6:00 到北京时间晚上7:30这段时间,STEEMIT.COM先是无法访问,然后好不容易可以访问了,显示的最新数据竟然是13天以前的。同时busy.org等网站也无法访问。

好几个朋友上来问我,STEEMIT肿么啦,我们这十三天的帖子会不会丢,我们这十三天的收益会不会清零?另外,还有人对STEEM表示的怀疑,是不是数据不安全啊?等等等等。


(图源 :pixabay)

尽管我在微信上答复了这几个朋友,但是我想可能这几个问题也是大家所关心的,恰好STEEMIT刚刚恢复正常,那么就发帖说一下这些问题。

API节点

为了说明这些问题的根源,我们先来说一下STEEMIT.COM、BUSY.ORG等网站都是如何访问STEEM区块链的。

我们可以把STEEM区块链看成一个大数据库(有别于传统的中心化数据库,它是去中心化并且数据不可篡改),那么STEEMIT.COM以及BUSY.ORG等网站就是用于查询和访问STEEM区块链的工具。

STEEM区块链为了便于大家访问,由RPC节点提供了一系列API,比如我们要读取一个区块的信息,那么就向节点发送发送类似如下请求信息即可:

{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_block", [21702122]], "id": 1}

比如这个信息就会返回编号21702122区块内的所有数据。同时我们也可以通过给节点发送查询信息来获得当前最新区块编号等区块链信息。

{"jsonrpc": "2.0", "method": "call", "params": ["database_api", "get_dynamic_global_properties", []], "id": 1}

任何人都可以运行和提供RPC节点服务,官网提供的节点为:https://api.steemit.com

节点缓存信息

知道了API节点,我们不难想象,当访问量很多很大时,节点会比较辛苦。每次大家向节点提问,节点都会去做响应的运算,然后返回对应的信息。

get_dynamic_global_properties,这个信息对于STEEM区块链而言,每个块(3秒)更新一次。假设这三秒内有1W个查询请求,一种方式是针对每个请求我们都去查区块链并返回信息,另外一种方式是,我们知道数据并没有变化,直接返回我们缓存的信息即可,然后每三秒更新一下缓存。

上述做法保证了返回的数据正确,并且节省了开销,这就是jussi,简单总结就是在steemd之上弄了个缓存层(caching layer)。

换句话说https://api.steemit.com并非是单纯的steemd节点,而是steemd+jussi。

JUSSI缓存故障

好了,现在我们知道了API节点,也知道JUSSI缓存层。

STEEMIT.COM、BUSY.ORG等网站就是访问官方节点https://api.steemit.com,来从STEEM区块链查询以及向其内写入信息的。

那么如果JUSSI缓存层出故障了,会是什么效果呢?比如说我向节点询问,当前最新块是多少?正常情况下,节点应该返回当前最新块的信息,比如现在'head_block_number': 21702109,,但是缓存出问题了,返回的是老旧的数据,返回的信息为:'head_block_number': 21342317,落后约40W个块,也就是约13天的样子。

这就是STEEMIT.COM以及BUSY.OGR,这段时间不好用的原因。

当这种情况发生时,我们可以通过其它好用的节点访问STEEMIT区块链,比如说:https://gtg.steem.house:8090

结论

网站以及软件等通过RPC NODE API来访问STEEMIT区块链。为了提升效率节省资源,STEEMIT官方节点集成了JUSSI缓存层。

JUSSI缓存层故障导致我们取回的最新区块编号等信息不够新鲜,进而导致STEEMIT和BUSY显示的都是13天以前的帖子😀。

了解了相关原因,我们就会清楚,STEEM区块链的数据还是安全的,我们的帖子和资产都不会消失,大可放心。


This page is synchronized from the post: 刚刚,就是刚刚,STEEMIT肿么啦?

O哥闲扯淡:买赞的财富梦

我的一个朋友微信上和我说:“O哥O哥,我发现了STEEMIT上致富的秘籍啦!” 我一听就来了精神:“快和我说说,是啥秘籍?我也要想致富😍”。

然后我这个朋友一本正经地告诉我:“就是买赞啊,我试了一下,花2SBD买赞,帖子显示的金额增加了4.2SBD呢,就算是去掉25%的点赞者奖励,还剩3.15 SBD,那么我净赚了1.15SBD呢😍”

事实真的如此吗?且听我扯扯。


(图源 :pixabay)

提示:O哥闲扯淡系列本就是闲扯淡,诸位千万别当真!

买赞之财富梦

其实类似的话语,我听好多朋友说过。有的朋友更是夸张,和我算了一笔账:

2SBD 买赞,净赚1个SBD,那么20个就赚10个,200个就赚100个,高达50%的收益啊!并且这只是一个帖子,如果我们每天发帖,每天买赞,不停地操作,那么财务自由指日可待啊。

STEEMIT 上Trending页面上的帖子似乎也验证了这点,一张图片一段话,收入数百SBD的比比皆是,这让我的朋友们和我聊起买赞都理直气壮,要是不合适不赚钱,为啥人家都买赞呢?

首先,声明一点,我从来没说过买赞不合算,买赞不赚钱等类似的话语,我只是想从买赞本身赚多少钱来入手,让大家有个清晰的认识,便于大家做出判断。

买赞之实际收益

说到收益,不得不提一点,文章上显示的数字并不是你实际得到的数字。你可能会说知道啦知道啦,不就是还要分给点赞者一部分嘛,大致乘以75%就是剩下给我的嘛。

这么说也未尝不可,但是实际上奖励是已SP+ (SBD、STEEM)组合形式发放的,另外,系统估算金额不等于市场金额,所以实际到手的资产折算成SBD要比显示的大幅缩水。

具体原理我在不少文章中分析过,感兴趣的同学自己翻翻啦,我就不啰嗦了,直接上结论,假设我们文章收益显示100SBD,那么我们最终能拿到多少?

请出我们的公众号,上述指令假设文章收益100SBD,分别显示了去除点赞者收益后,按Power UP 100%以及Default(50%/50%)设置的情况下,作者最终拿到的收益折合成SBD是多少。

也就是说,显示100SBD,最终我们得到的资产市场估值约为51.540 SBD,也就是说,约为显示金额的51%。

好了,按这个我们再回头计算一下买赞收益,还是假设花2SBD买赞,帖子显示的金额增加了4.2SBD,那么实际收益是多少呢?

实际获利:`4.251% - 2 = 0.142 SBD`*
收益率为:`0.142/2100% = 7.1%`*

也就是说,实际收益没有想象的那么高。

买赞收益之其它

好了,你现在知道了收益其实没那么高,但是你可能会说了,收益没那么高也是有收益的嘛,麻雀虽小也是肉啊。好的,我不否认这点,但是还有一些其它因素要考虑一下:

卖赞机器人是否能点出那么多金额

我们的假设是:花2SBD买赞,帖子显示的金额增加了4.2SBD,卖赞机器人是否能点出对应比例的金额是个问题。当然,也有可能比这个高。

现金变成7天后的收益

另外一个因素就是我们的SBD等流动性资产,通过买赞,变成别人的流动性资产,而我们得到的是账面上的数字,要到帖子结算后才能拿到。

并且一部分资产转换了成SP,完全变现需要13周的周期。

价格波动的问题

假设当前喂价较高,我们的帖子多出来4.2SBD的显示金额,但是如果价格一路走低,喂价降低,这个多出来的金额也会响应的减少。

举一个略为极端的例子,假设喂价降低至当前喂价的一半,那么4.2SBD就大致会变成2.1SBD,再乘以51%(可能会变化)那么,我们买赞就亏了。

当然,虽然我们要承受价格降低的风险,但是同样会享受价格上涨的福利。

被踩的风险

现在很多大户,对买赞机器人把一些帖子点到很高表示不满,所以如果帖子收益很高,内容还不是那么丰满和吸引人,有一定概率被踩。

如果被踩,铁定就亏了,不过好消息是大部分大户不舍得用自己的SP去踩人。

那么还要不要买赞?

这个问题见仁见智吧,其实买赞也不是毫无优点。

比如说,当你的帖子金额高达数百,上到热门类目甚至全网的Trending页面,那么会有一个极好的宣传效果,有可能就被大佬或者小鱼们看好,给你点赞,这部分就是额外的收益了。(同样有被踩的风险)

另外,如果我们想推广产品或者项目,通过买赞弄个全网第一,那么推广的效果还应该是极佳的。比如发个ICO骗钱,这样骗到的钱肯定比买赞花费要多得多。

粗暴点总结的话就是,买到一定规模(上热门),那么会带来一些额外的效益,买的少的话,权且当作玩吧。

(图源 :pixabay)

我个人建议的话,不论买赞与否,把帖子写得说得过去,机会会更多一些。


本文为个人观点,并不构成操作建议,仅供参考


This page is synchronized from the post: O哥闲扯淡:买赞的财富梦

对垃圾回复信息说不! / Say No to comment Spamming!

垃圾回复

垃圾回复令人人费解

最近我的一个C++学习笔记帖《C++ Range-based for loop》底下收到几个热心回复。

反正凭我的智商,我是没看出来我的帖子内容和彩礼、嫁妆、车子房子等有毛线关系。又比如在我发的花下边回复:

我哥们和花咋扯上关系的?

垃圾回复无数不在

于是我又看了这几个家伙的其它回复信息,比如在大伟保护数据隐私的帖子底下回复:

在大伟的其它帖子下回复:

在老道茶馆 中回复:

垃圾回复复制别人信息 & 骗到点赞

仔细调查了一下,这些垃圾回复都是复制别人的回复信息,然后用自己的账户发出来。我估计是个外国骗子,不懂中文。

在回头看一下上边我列举出的垃圾回复信息,在老道茶馆等帖子中,他回复的毫不相干的垃圾内容,竟然获得了点赞!看来骗子们为了赚钱,真的很努力了。


(图源:pixabay)

对垃圾回复说不

其实除了我列出的这几个用户以外,我们帖子的评论中还有各式各样的垃圾信息。

这些垃圾回复,浪费我们和其它访客的大量宝贵时间,耗费STEEM区块链的资源,还有可能骗到点赞!是可忍孰不可忍!对待垃圾回复信息以及垃圾回复信息的发布者,要像严冬一样残酷无情(雷锋语)

还有哪些类型的回复信息,你认为是垃圾信息或者让人不爽呢?要不要也像严冬一样残酷无情呢?这真是让人很纠结的事情啊😵。


封面图源:pixabay


This page is synchronized from the post: 对垃圾回复信息说不! / Say No to comment Spamming!

实战:来扒扒骗子(钓鱼者)是怎么骗人/钓鱼的? / anti-phishing

之前我的一个帖子刚刚发布不久,我就看到文章底部多了一条新的回复。

凭我高达25的智商,一看就知道是骗子啦,上当肯定不会上当的,不过我就是想看看他咋行骗的。

骗子用文字代替链接

以前我说过,STEEMIT网页解析增加了一个新功能,就是冒充STEEMIT的页面链接或用红色字体警示。

比如下边代码:
[steemit.com/@oflyhigh](http://a.com)

会显示这个效果

所以骗子现在有新办法了,用文字替代STEEM链接,这样不不会有红色警告信息了。

骗子把回复自己顶上来

为了让诈骗信息更容易被看到,当然也为了避免别人在看到诈骗信息之前看到其它机器人的警示信息,骗子会把自己的回复顶上来。

同时为了避免警示信息跟在后边显示,骗子在回复中加了一堆换行信息。我们可以通过阅读帖子的源码,看到回复信息里的N多换行。

骗子把警示信息踩灰

@arcange 的机器人会及时的提示钓鱼/诈骗信息。但是对于骗子而言,这可不是个好事,如果大家阅读到警示信息后不点诈骗信息,就不妙了。


所以,这个骗子,及时的把 @arcange 发布的警示信息踩灰,这样就容易被别人忽略掉了,不得不说,这是个技术含量还挺高的骗子。

骗子的域名和STEEMIT类似

我们继续来扒骗子的内裤,在新浏览器窗口中输入骗子的链接(强烈不建议进行此项操作


我们可以看到骗子的站点域名和STEEMIT高度相似,另外注意站点域名前边的小锁头,这真是个认真负责的站长,还申请了网站SSL证书。不过现在申请证书成本很低,有不少免费证书呢。这种低级证书只能证明站点和用户之间数据传递是被加密的,证明不了其它问题。

骗子把文章数据抓取过来

继续扒,打开链接之后,我们会看到对应的文章数据,为了让网站和文章链接看起来更加真实,骗子复制了我们对应的正文信息。


是不是看起来和我的对应正文一样,简直是天衣无缝,如果不是我带着戒心去访问,我觉得我肯定会上当。

如果这个骗子把这能力用到正道上,那么开发出类似busy、dtube之类的站点,貌似也应该没什么难度,哎,一声叹息。

自动跳转到登陆页面

好了,现在如果不是我警惕性特高,我已经相信我上了一个真的STEEMIT了。

然后骗子的页面代码中用了如下代码控制自动跳转:
<meta http-equiv="refresh" content="3; url=./login">

然后弹出登陆窗口

这时候,一不小心就会输入登陆信息,然后你的账户密码(私钥)等就会到骗子手里了,骗子就可以拿去胡作非为了(比如把你的钱转走,用的账户发诈骗信息,给诈骗信息点赞等等)

收尾工作做得漂亮

你以为骗子拿到你的账户密码就完结了?那一定不是一个负责任的骗子。

我尝试在上边登陆窗口随便输入点登陆信息,点击Login按钮,稍微等待后,骗子将页面重定向回STEEMIT.COM。

也就是说,STEEMIT.COM点钓鱼信息、进入钓鱼站、被盗取密码、离开钓鱼站回到STEEMIT.COM,整个过程天衣无缝,不注意的话,你完成整个操作不会觉得任何异常,根本意识不到自己账户密码被盗了。这样骗子就有足够的时间,来从从容容地做坏事了。

总结

通过一个真实的钓鱼信息,我们来捋一遍骗子诈骗/钓鱼的全套流程,我们了解到,骗子采取了如下技术和手段:

  • 用文字代替链接
  • 把回复自己顶上来
    • 回复信息里采用大量换行
  • 把警示信息踩灰
  • 域名和STEEMIT类似
    • 域名启用了HTTPS证书
  • 把文章数据抓取过来
  • 自动跳转到登陆页面(此处盗取账号密码)
  • 跳转回STEEMIT.com (掩盖诈骗/钓鱼痕迹)

看看骗子的骗术多高超,这也解释了为什么总有人中招,甚至中招之后很久都不知道自己已经中招了,我高达25的智商,都差点中招呢😱。另外,顺便感慨一下,骗子都这么努力了,我们还好意思虚度光阴嘛?!

封面图源:pixabay


重要提示:不要好奇点开骗子链接,骗子有可能有更高超手段侵入你的浏览器或者电脑,那样就惨啦!


This page is synchronized from the post: 实战:来扒扒骗子(钓鱼者)是怎么骗人/钓鱼的? / anti-phishing

美丽心情 / Beautiful flowers

本多ruru有一首歌《美丽心情》,部分歌词内容如下:

多雨的冬季总算过去
天空微露淡蓝的晴
我在早春清新的阳光里
看着当时写的日记

当我外出看到路边的小花时,突然脑海里就想起这首歌的歌词和旋律,不过歌词已经被我下意识地替换成寒冷的冬季总算过去,另外,好像我也没写啥日记,倒是在STEEMIT上写了一堆帖子。

20180417_074842.jpg

之所以这么感慨,是因为前些天实在是太冷了,连心情都有些冻结了,不过看到这小花的瞬间,它就解冻了。

20180417_074904.jpg
还有这新绿,生机勃勃,让快要腐朽的我一下子倍感惭愧,是否也应该向植物学习,多些欣欣向荣之意呢。

20180417_074944.jpg

20180417_075001.jpg
如果我没记错的话,去年秋季,这里挂着的水果是梨,那么这小白花当然应当是梨花了。

20180417_075049.jpg
而这应该是杏花吧?突然想起那句经典的小楼一夜听春雨,深巷明朝卖杏花,为啥要会有人买杏花呢?让它就长在树上,让人欣赏,再等它变成果实,那才叫自然之美。

20180417_075120.jpg

20180417_075123.jpg
迎春花依旧开得绚烂,金灿灿的,不过不用她报春,我也知道春天真的来啦。

相关链接


This page is synchronized from the post: 美丽心情 / Beautiful flowers

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×