打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
函数与类
userphoto

2022.12.24 上海

关注

函数

首先注意不要和数学中的函数搞混了

那么到底什么是函数呢?

函数其实就是当我们在程序中需要大量重复的代码块,我们将其封装成一个代码块,用一个名字来表示,而这个名字是标识符(变量名)。需要遵循标识符(变量名)的规则。

函数的优点就是避免了代码重复率,提高开发效率。

举个例子:

了解函数的作用,如下例,计算数值

如果是计算一个数的累加值(就是1+2+3+...+n),比如10 (1+2+3+...+10)

!
导入失败


对比用函数来计算

!
导入失败


当计算的是一个数的时候,会觉得用for循环和用函数都一样,为什么要用函数多此一举呢?

我们学习函数的原因是,当需要重复一段代码非常多次的时候,用函数这个工具,会轻松很多,加快了工作效率。

比如让你一次性算10,20,30很多数字,我们就可以用函数来计算,比如

!
导入失败


重复调用三次a() 函数,分别输入10,20,30即可算出答案

如果不用函数的话,用for循环,代码篇幅长度是这样的

!
导入失败


对比上一个调用函数的方法,这个用for循环去写代码,就明显的篇幅过长!

总结:函数的作用就是封装一段代码,调用的时候,只需要一行代码 函数名(),即可让函数里面的代码运行,提高工作效率~

学习函数的结构

如果A让代码缩进,那代码的服务对象就是A

!
导入失败

!
导入失败


无参函数

无参函数是最基本的函数,基本上很少用到,都是拿来练习理解函数的。

定义一个无参函数

def 函数名字():
    代码

调用这个无参函数

函数名字()


有参函数

函数是可以传递参数的,而参数分为形参和实参。

形参就是形式上的参数,就像一家公司有员工,清洁工,董事长等职位,但是有些职位却空着,这些空着的职位,就相当于形参,需要有人去做这个职位,才能发挥作用,而这个能发挥职位作用的人,就叫做实参(实际参数)。

而我们定义有参函数的时候,需要定义形参来表示我们的函数,有这些东西,你想让我们的函数去发挥作用的话,就需要给我们传递实际参数。

定义和调用

有参有参,在哪里体现的有参呢?

在我们定义的时候,我们需要在括号里面定义形参,用于接收参数。

而在我们调用的时候,也是通过函数名后面的括号传递实参的。

实例

我们会定义一个有参函数来使两个参数拼接在一起,并遍历。

def PinJie(a, b):
    str_ = str(a)+str(b)
    print(str_)
    for i in str_:
        print(i)

PinJie('sasa', 4564)

#也可以这么写

'''

PinJie(a='sasa',b=4564)

这样写的好处是

就算你的位置写错了

参数传递的也还是对的

也就是说,参数传递的位置不固定

就像这样

PinJie (b=4564, a='sasa')

是完全一样的

'''

运行:

!
导入失败


return的使用

之前说过,return 一般是使用在函数中的,那么他的作用是什么呢?

先根据见名知意的规律来解读:返回。

确实,他的作用就是返回,返回值。

通过return xxx来达到返回值得目的,这里是返回了xxx这个东西,至于xxx 是什么。众所周知,xxx可以什么都是!根据我们需要使用的函数值来定。

那么返回的值到了哪里呢?到了函数的调用那里,这个函数名字(参数)就是返回的值。

例子

看上面的那个函数,他显示拼接后的结果,使用了print()函数(内置函数)。

那么我们使用return试试。

def PinJie(a, b):
    str_ = str(a)+str(b)
    return str_
    for i in str_:
        print(i)

PinJie('sasa', 4564)

那么会怎么样呢?

答案是,什么都不会显示!

!
导入失败


为什么呢?因为我们没有使用print()函数(瞎说,那不是有!)。

为什么这么说呢?因为上次讲过,return用于结束一段代码,而我们在中间return,下面的代码for循环也就不会被执行,就直接结束了。

怎么显示循环呢?把return放在函数最下面!

def PinJie(a, b):
    str_ = str(a)+str(b)    
    for i in str_:
        print(i)
    return str_
PinJie('sasa', 4564)

答案是,函数内循环的值确实有显示出来,证明我们刚才想法是对的!

!
导入失败


那么上面说了返回的值被 **函数名()**接收了,那么他现在就是一个值了,想要让它显示,那么只能用print()了啊!

def PinJie(a, b):
    str_ = str(a)+str(b)
    return str_
    for i in str_:
        print(i)

p = PinJie('sasa', 4564)
print(p)

结果:

!
导入失败


他就显示了返回值,也就是函数拼接str_的结果值,需要注意的是我们这里return的位置没有改变,所以return下面的代码for循环也就不会被执行,也就不会打印出来str_中的每个字符了,想要都展示出来,还是要放到函数最下面,可以自己去试试了。

函数与入门课的结合

在 ForTrader 里面,我们会看到四个函数模块

def indicators(context):
    '''指标'''

def choose_stock(context):
    '''标的'''

def timing(context):
    '''择时'''

def control_risk(context):
    '''风控'''

4个模块都是函数的知识,在学习的过程中,我们需要做的是写函数的内容,就是在对应的函数里面写入我们的策略代码

比如这里面的代码内容,只需要学会填充到对应的函数即可!

指标 函数 用于计算各种交易指标的数值。计算指标的方法多种多样,可以是经济数据或估值指标,也可以是技术指标

标的 函数 根据你的交易想法选择相应的投资标的,可以是股票、基金等标的代码。选择标的时,需要判断某只标的是否满足该条件,如果满足,就将该标的添加到投资组合中,如果不满足,就不加入投资组合或者从投资组合中删除。

择时 函数 主要解决“什么时候交易”的问题。在这个模块编写策略的买入卖出逻辑,在合适的时机交易标的。

风控 函数 就是指风险管理者采取各种措施和方法,消灭或减少风险事件发生的各种可能性,或风险控制者减少风险事件发生时造成的损失。它是策略组成的一个可选部分,并不是所有经典的策略都存在风险控制逻辑。

def indicators(context):
    '''指标'''
    # 计算15日平均线
    context.sma = SMA(context.data.close, period=15)
    # 设置止盈比例为0.1
    context.p_takeprofit = 0.1

def choose_stock(context):
    '''标的'''
    # 设置标的为中国石油
    context.symbol_list = ['601857.XSHG']

def timing(context):
    '''择时'''
    # 如果未持仓
    if context.position.size == 0:
        # 如果当天收盘价在15日均线之上
        if context.data.close[-1] < context.sma[-1] and context.data.close[0] > context.sma[0]:

            # 执行买入
            context.buy(data=context.data)

    # 如果当天收盘价在15日均线之下
    elif context.data.close[-1] > context.sma[-1] and context.data.close[0] < context.sma[0]:

        # 执行平仓
        context.close(data=context.data)

def control_risk(context):
    '''风控'''
    # 如果持仓
    if context.position.size != 0:
        # 计算止盈价
        context.log(context.position.size)
        limit_price = (1 + context.p_takeprofit) * context.position.price

        # 如果当前收盘价大于止盈价
        if context.data.close[0] > limit_price:
            # 执行平仓
            context.close(data=context.data)    

编程语言有面向对象(Java,Python)和面向过程(C语言)之分,面向对象需要一些抽象的思维才行。

面向过程和面向对象有什么区别呢?

面向过程注重亲力亲为,意思也就是自己去干这件事;而面向对象更倾向于找个人给自己做事。

就拿那个老生常谈的例子来说吧——洗衣服:

面向过程

面向过程的洗衣服是:

把衣服拿到洗衣机旁边

放进去

等待

捞出来

等下一次洗衣服,你还得重复这些操作

而这就是函数式编程。

面向对象

而面向对象则是:

创造一个机器人

教他如何洗衣服

把衣服拿到洗衣机旁边

放进去

等待

捞出来

让他去干活

等下一次需要洗衣服,就让机器人去干就行了。

而面向对象绕不开的就是类和对象了,接着往下看吧。

类和对象

看了上面的内容,应该已经对面向对象有了一定的理解吧,那么来看看什么是类和对象吧。

类是个抽象的东西,比如说人类,动物类,植物类,类是具有某些相同特征的事物的集合。

那么如何在python中定义一个属于我们的类呢?

# 定义一个Xxx类
class Xxx:
    代码块

这就成了。

注意类名首字母大写,这样可以与函数名进行区分,方便后面我们调用时辨别。

而类需要有属性,行为(方法)等东西

而属性就是在类里面的局部变量。

而行为就是定义在类里面的函数。


说到类,比较难的点,就只有初始化方法和Self的用法

初始化方法

初始化方法的特征,函数名是 __init__ 即 双划线init双划线

!
导入失败


类方法的调用,格式通常是 实例名.方法名() 才可以调用,但是这里person=Chinese()类的实例化的代码,就能引起__init__的方法调用

这里的终端结果,只有init的方法再运行

!
导入失败


而a函数没有运行,是因为我们没有进行一个调用函数,如果我们在函数下面写多一行,比如

!
导入失败


这时候,a方法里面的print()语句就会打印输出~

!
导入失败


这个对比,我们可以了解到,初始化方法(init)他是可以趁 类初始化的代码运行的时候,他也会自动运行

总结:我们只是创建了实例,还没有调用,初始化方法就自动执行了!如果不是初始化方法,函数的调用需要写调用函数的代码

Self的用法(需要掌握)

类的定义格式

class 类名():
def 方法名(self):

这里多了一个self参数,它用来指对象本身。

因为在定义类的时候,不清楚将会有哪个实例是这个类的一员,但是类里面的方法要在其他方法调用的时候需要用到 实例名.方法名() 格式,因此我们需要设置一个形式参数一样的存在,如self,作为一个(形式上的)实例名用于 调用方法和属性,因此在类里面调用方法的时候,只需要写 self.方法名()

这个self是可以用其他变量名字代替的,可以用aaa,bbb来替代self的作用

在ForTrader平台,他本身是在一个大的类运行代码,因此我们的 指标,标的,择时,风控方法是在类里面的

因此变量名context是一个跟self一样的形式参数,充当 账户 的作用

那对象是什么呢?

对象

对象是类的实例化,拿人类来说,人是一个类,而我们每个人都是人这个类的实例化对象。

看代码:

# 定义一个人类
class 人:
    代码块

# 实例化对象
大黄 = 人()

很明显,大黄是人这个类的实例化对象,换句话说,大黄是个人,在这句话里,大黄就是对象,人就是类。

用Python代码展示洗衣服例子

虽然Python是面向对象的语言,但是他也能面向过程编程,也就是函数式编程。

面向过程洗衣服

话不多说,直接上代码

# 大家好,我是大黄,我要开始洗衣服了
def 拿衣服():
    print('把衣服拿到洗衣机旁边')

def 放进去():
    print('把衣服放进洗衣机')

def 等待():
    print('等衣服洗好')

def 捞出来():
    print('把衣服捞出来')

拿衣服()
放进去()
等待()
捞出来()

运行结果:

!
导入失败


我们需要调用每一个的行为才会执行对应的动作。


面向对象洗衣服

代码:

class Robot:

    def __init__(self):
        print('把衣服拿到洗衣机旁边')
        print('把衣服放进洗衣机')
        print('等衣服洗好')
        print('把衣服捞出来')
大黄 = Robot()

运行结果:

!
导入失败


我们只要创建一个大黄的实例,也就是一个机器人,对应的它就会帮我们执行里面包含的行为,从而执行所有的动作,所以类也可以理解为行为的一个合集。.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python指南:高级程序设计之过程型程序设计进阶
从能做什么到如何去做,一文带你快速掌握Python编程基础与实战
第12关、我们都是中国人
一篇文章带你了解Python运算符重载
量化交易-涨停回调短线策略
一个典型的双均线策略
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服