零基础学编程022:函数的世界

通过《零基础学编程021:获取股票实时行情数据》的学习,我们已经可以取出“谷歌”股票的开盘价,今天我们要取出GAFATA共6支股票的开盘价。

先回顾上次的代码:

import urllib.request as req

with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f :
    hq = f.read().decode('GBK')
    v = hq.split(',')
    print(v[1])

要获取6支股票行情,那就先找到GAFATA的股票编码(gb_goog,gb_aman,gb_fb,gb_aapl,gb_hk00700,gb_baba),然后把这段代码复制几遍,把股票编码替换一下就可以完成任务了。

import urllib.request as req with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=gb_amzn') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=gb_fb') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=gb_aapl') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=rt_hk00700') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[2]) #注意港股有所不同 with req.urlopen('http://hq.sinajs.cn/list=gb_baba') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1])

任务虽然完成,但这种代码太重复了,有四行代码重复了6次,只是股票编码不同而已。如果以后我们要取出收盘价,又得把所有语句中带 v[1] 的地方都换掉,非常不方便。所有编程语言中都提供了“函数function”这个特性来解决重复代码的问题。

编程新手学习时,可以把编程语言中的函数与数学中的函数进行类比,数学函数中有函数名、变量、公式、函数值,在编程语言中分别对应着函数名、参数、函数体、返回值。数学中有二元函数,程序中有多个参数。

例如:我们在《零基础学编程011:复利数据表问题(总结) 》里遇到的复利公式就是一个简单的数学函数。

在Python中定义一个函数非常方便,刚才的复利公式可以这样写:

def f(x) :
   return (1 + 0.01) ** x

关键词def表示定义一个函数块,可以用英语单词define function(定义函数)来助记,定义完成后,以后只需调用函数(call function)就可以得到相应的结果。

print( f(100) )
print( f(365) )

函数的一个主要功能就是减少重复的代码,便于将来的维护。回到我们的股票程序上,我们定义一个函数,给出股票编码,返回开盘价。

def price(stock) :
    url = 'http://hq.sinajs.cn/list=' + stock
    with req.urlopen(url) as f :
        hq = f.read().decode('GBK')
        v = hq.split(',')
        return v[1]

有了函数定义之后,只需要调用6次,就可以得到6支股票的行情了。

print( price('gb_goog') )
print( price('gb_amzn') ) 
print( price('gb_fb') )
print( price('gb_aapl') )
print( price('rt_hk00700') ) 
print( price('gb_baba') ) 

其实print也是函数,不过它是python系统自带的,也叫内置函数(built-in function)。而我们用def定义的函数,称为自定义函数

小结:

  • 函数function可以减少重复性代码,便于将来的维护
  • 有内置函数,我们自己写的叫自定义函数
  • python中大量模块中包括了大量函数
  • def 关键字用于定义一个函数块
  • 冒号之后的各行是函数体,要注意缩进
  • 用return返回想要的结果
  • 调用函数的基本形式:函数名( 函数参数 )

上面的程序中有一个小问题,你能否发现?你能自己解决它吗?

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-02-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菜鸟前端工程师

JavaScript学习笔记016-字符串方法0数组方法0值类型与引用型

572
来自专栏闰土大叔

闰土说JS进阶之「戏说数组」

前言 最近一段时间,我女票跟我诉苦说他们公司很多同事(包括老板),一到中午都痴迷于玩王者荣耀,不玩的会受到排挤,参与不进话题。“什么?你居然不知道梦奇,这可是王...

34611
来自专栏编程

自学Python笔记(二)

作为最最基础的初学者,尤其是面对中小学生学习Python我想大概了解一下Python,能编个小程序,能看懂一般的程序就可以,如果想深一步的学习还是需要静下心来好...

1627
来自专栏怀英的自我修炼

Java漫谈6

今天这篇想聊聊数组。 在聊数组之前先聊个别的,如果想在Java中实现一个 数字-月份 转换,那我该怎么做呢?就比如数字1代表了一月份,数字2代表了二月份…数字1...

3429
来自专栏C语言及其他语言

实例说明

上一节,我们大致总揽了一个简单C程序的框架,程序如下: #include<stdio.h> /*引入头文件*/ int main(void) /*一个简单的C程...

2658
来自专栏算法channel

动态规划中篇:爬楼梯

主要推送关于对算法的思考以及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。 0...

3619
来自专栏Java3y

栈和队列就是这么简单

一、前言 上一篇已经讲过了链表【Java实现单向链表】了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并...

34910
来自专栏用户2442861的专栏

sizeof小览

http://blog.csdn.net/scythe666/article/details/47012347

381
来自专栏desperate633

LintCode 硬币排成线 II题目分析代码

有 n 个不同价值的硬币排成一条线。两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。

472
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十三)

如果是你自己定义函数,函数名要符合变量命名规则,并且不能是系统关键字(在jupyter中,打出系统关键字是绿色的)

782

扫码关注云+社区