繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168财经网>人物频道>帖子

Python入门(7)- 函数【选修篇】

作者/谎言梦 2019-05-10 05:53 0 来源: FX168财经网人物频道

这是面向新用户的 Python 教程,并结合了 JoinQuant 获取到的数据进行了讲解。

如果你之前没有学过 Python, 或者对 Python 不熟,那不要再犹豫了,这个教程就是为你准备的!

更多内容请查看量化课堂 - Python编程板块。

本节概要: 主要介绍了函数一些扩展公能,比如定义全局变量、编写匿名函数、编写递归函数等等

【Python入门(7)】函数【选修篇】¶

这一节会讲解一些函数的其他功能,如全局变量、递归函数、匿名函数lambda。他可以很大效率的提升你的工作效率!

一、global声明了一个全局变量¶

  • 全局变量是位于模块文件内部的顶层的变量名

  • 全局变量如果是在函数内被赋值的话,必须经过声明

  • 全局变量名在函数的内部不经过声明也可以被引用

在JoinQuant平台运行回测时,除了可以使用global定义全局变量,也可以中使用全局对象g,https://www.joinquant.com/api#g

这是为了方便用户使用,我们自己定义的方法!

在模拟盘中,如果中途进程中断,我们会使用pickle.dumps序列化所有的g下面的变量内容, 保存到磁盘中,再启动的时候模拟盘就不会有任何数据影响。如果没有用g声明,会出现模拟盘重启后,变量数据丢失的问题。

Python查找名字的规则是LGB规则:

  • 大多数名字引用在三个作用域中查找:先局部(Local),次之全局(Global),再次之内置(Build-in)。
x = 88
def func():
    global x
    x = 99
func()
print x
99
y,z = 1,2
def all_global():
    global x
    x = y + z
all_global()
print x
3

二、匿名函数 lambda¶

python 使用 lambda 来创建匿名函数。

  • lambda只是一个表达式,函数体比def简单很多。

  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

  • lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数。

  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

import time
start = time.clock()
fib=lambda n,x=0,y=1:x if not n else fib(n-1,y,x+y)
print fib(20)
end = time.clock()
print "read: %f s" % (end - start)
6765
read: 0.000425 s
start = time.clock()
fib=lambda n:1 if n<=2 else fib(n-1)+fib(n-2)
print fib(20)
end = time.clock()
print "read: %f s" % (end - start)
6765
read: 0.004816 s

三、Python函数中的多态¶

一个操作的意义取决于被操作对象的类型

def times(x,y):
    return x*y
times(2,4)
8
# 传递了与上不同的数据类型
times('Python',4)
'PythonPythonPythonPython'
def intersect(s1,s2):
    return [x for x in s1 if x in s2]
s1 = 'Python'
s2 = 'python'
intersect(s1,s2)
['y', 't', 'h', 'o', 'n']
# 传递了不同的数据类型
intersect([1,2,3],(1,4))
[1]

四、递归¶

(1)递归就是在过程或函数里调用自身;

(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归算法一般用于解决三类问题: (1)数据的定义是按递归定义的。(比如Fibonacci函数) (2)问题解法按递归算法实现。(回溯) (3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)   

递归的缺点:递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

示例:斐波那契数列

斐波那契数列由十三世纪意大利数学家斐波那契发现。数列中的一系列数字常被人们称之为神奇数奇异数。具体数列为:0,1,1,2,3,5,8,13,21,34,55,89,144,233等,从该数列的第三项数字开始,每个数字等于前两个相邻数字之和。而斐波那契数列中相邻两项之商就接近黄金分割数0.618,与这一数字相关的0.191、0.382、0.5和0.809等数字就构成了股市中关于市场时间和空间计算的重要数字。

在金融市场的分析方法中,斐波那契数字频频出现。例如,在波浪理论中,一轮牛市行情可以用1个上升浪来表示,也可以用5个低一个层次的小浪来表示,还可继续细分为21个或89个小浪;在空间分析体系中,反弹行情的高度通常是前方下降趋势幅度的0.382、0.5、0.618;回调行情通常是前方上升趋势的0.382、0.5和0.618。

def fib(num):
    result=[0,1]
    for i in range(num-2):
        result.append(result[-2]+result[-1])
    return result
print fib(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
import time
start = time.clock()
def fib(n):
    if n<=2:return 1
    else:
        return fib(n-1)+fib(n-2)
print fib(20)
end = time.clock()
print "read: %f s" % (end - start)
6765
read: 0.005082 s
start = time.clock()
def fib(n):
    return n<=2 and 1 or fib(n-1)+fib(n-2)
print fib(20)
end = time.clock()
print "read: %f s" % (end - start)
6765
read: 0.004045 s
 
分享到:
举报财经168客户端下载

全部回复

0/140

投稿 您想发表你的观点和看法?

更多人气分析师

  • 张亦巧

    人气2208文章4145粉丝45

    暂无个人简介信息

  • 张迎妤

    人气1912文章3305粉丝34

    个人专注于行情技术分析,消息面解读剖析,给予您第一时间方向...

  • 指导老师

    人气1864文章4423粉丝52

    暂无个人简介信息

  • 李冉晴

    人气2320文章3821粉丝34

    李冉晴,专业现贷实盘分析师。

  • 梁孟梵

    人气2184文章3177粉丝39

    qq:2294906466 了解群指导添加微信mfmacd

  • 王启蒙现货黄金

    人气320文章3503粉丝8

    本人做分析师以来,并专注于贵金属投资市场,尤其是在现货黄金...

  • 金泰铬J

    人气2328文章3925粉丝51

    投资问答解咨询金泰铬V/信tgtg67即可获取每日的实时资讯、行情...

  • 金算盘

    人气2696文章7761粉丝125

    高级分析师,混过名校,厮杀于股市和期货、证券市场多年,专注...

  • 金帝财神

    人气4760文章8329粉丝119

    本文由资深分析师金帝财神微信:934295330,指导黄金,白银,...

FX168财经

FX168财经学院

FX168财经

FX168北美