零基础学编程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 条评论
登录 后参与评论

相关文章

来自专栏一枝花算不算浪漫

一道简单的HashMap面试题所想到的...

原以为自己对HashMap的源码理解的还算可以了,应该足够应付面试了。但是看到这个问题自己确实也是懵逼了一下。 查了下资料,答案是JDK1.7是插入到首部,...

703
来自专栏灯塔大数据

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

为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

843
来自专栏Albert陈凯

Scala代码编写中常见的十大陷阱

很多Java开发者在学习Scala语言的时候,往往觉得Scala的语法和用法有些过于复杂,充满语法糖,太“甜”了。在使用Scala编写代码时,由于语法和编写习惯...

2395
来自专栏嵌入式程序猿

号外号外:无规矩不成方圆(4)

本文MISRA规则由嵌入式程序猿整理自网络,版权归原作者所有 不能使用三字母词 三字母词由2 个问号序列后跟1 个确定字符组成(如, ??- 代表“ ~”(非)...

2605
来自专栏封碎

尾递归 博客分类: 算法 Erlang算法CC++C#

递归很常用,但是很耗内存,因为需要存储临时变量,当递归次数多了,占据的内存数量惊人。

722
来自专栏顶级程序员

Python 工匠:编写条件分支代码的技巧

我一直觉得编程某种意义上是一门『手艺』,因为优雅而高效的代码,就如同完美的手工艺品一样让人赏心悦目。

742
来自专栏鸿的学习笔记

python新手应注意的一些小问题

最重要的是看你公司喜欢哪个版本的python。。。。对于你个人而言,python2与python3的差别你可以忽略。。。。 一.注意pep8的编程风格,请记住...

542
来自专栏用户2442861的专栏

C++ 智能指针详解

http://blog.csdn.net/xt_xiaotian/article/details/5714477

2071
来自专栏皮皮之路

【JDK1.8】Java 8源码阅读汇总

3457
来自专栏应用案例

不到40行代码构建正则表达式引擎

原文:Build a Regex Engine in Less than 40 Lines of Code (作者:Nick Drane ,翻译:Diwei) ...

1837

扫码关注云+社区