Python 中的函数
学了 Python 中的数据类型,语句,接下来就来说一下 Python 中的函数,函数是结构化编程的核心。我们使用函数可以增加程序的可读性。自定义函数时使用关键字def
函数由多条语句组成。在定义函数的时候我们可以使用如下的方式给函数定义一个解释文档。
def square(x):
'This is comment of this method !'
return x * x # 获取方法注释信息
square.__doc__
上面定义的函数我们就可以通过函数名.__doc__
的方式获取方法的文档字符串。
另外,所有的函数都有返回值,如果你没有显示的告诉它返回什么,则返回None
一个函数怎么能少得了参数的部分呢,一不留神可能就会搞错,这里大概说一下,若传递的参数为不可变的参数,则不会修改参数的值,像是 数字,字符串,元组,但若是引用值的话,就可能会将原来的值改变。比方说 列表,字典。可以采用切片的方式避免对传入列表的修改,如:change(names[:])
这样的话我们传入的是names列表的一个复制版本,而对 names 本身没有影响。
关键字参数和默认值,举例说明
def hello(greeting = 'Hello',name = 'world'):
print('{},{}!'.format(greeting,name)) hello()
Hello,world! hello(name = 'YJK923')
Hello,YJK923!
可变参数:允许用户提供任意数量的参数。使用 *
号将提供的所有参数收集到一个元组中。这种用法在赋值的时候也遇到过。举例
def print_params(*param):
print(param) print_param('Testing')
Testing print_param(1,2,3)
(1,2,3)
星号的参数最好放在最后,不然在调用方法的时候需要指出星号参数后面的参数的值是多少。
还有一种使用两个星号,是用于收集带有关键字参数的方法,得到的值是一个字典而不是一个元组。
def print_dict(**params):
print(params) print_dict(x = 1,y = 2,z = 3)
{'z':'','x':'','y':''}
上面两个都是在定义函数的时候使用了 * ,那我们在调用的函数的时候也可以使用星号,这也就是分配参数,像这样
def add(x,y):
return x + y param = (1,2) # 定义一个元组,用做参数
add(*param) # 使用 * 来分配参数
3 # 结果为 3 ,这就是分配参数之后的结果
Python 中的作用域的概念类似于 Java,所以理解起来没有问题,但是 Python 好像都不是老老实实的,我们知道在方法里的变量是局部变量,我们在方法里使用时,全局变量不受影响,但是 Python 社区的小伙伴就是想改变全局变量的值,该怎么操作呢?发明了一个关键字global
用于指定某个方法里的值为全局变量。
x = 1
def change(x):
global x # 此时的x就是指向全局变量x
x = x + 1 change(x)
此时 x = 2
递归 : 函数之间的相互调用是很正常的,存在这么一种情况,那就是自己调用自己,这就是递归调用。
举例说明
# 计算数字n的阶乘 n ! = n * (n-1) * (n -2) * ... * 1
# 分析:1 的阶乘为 1,大于 1 的数 n 的阶乘等于 n-1 的阶乘 * n
def factorial(n):
if n == 1 :
return 1
else :
return n * factorial(n-1)
递归函数通常包含两部分内容,一是基线条件,满足条件函数将直接放回一个值,像上面的n = 1 return 1
二是包含一个或多个调用,这些调用旨在解决问题的一部门。这里的关键是,通过将问题分解为较小的部门,可避免递归没完没了,因为问题终将被分解成基线条件可以解决的最小问题。(抽象啊,多看看,体会体会吧!)
# 计算某一个数的幂
# 分析:power(x,n) 表示计算 x 的 n 次幂。也就是将数 x 自乘 n-1 次。
# 对于任意数来说,n 为 0 的时候结果都为 1,n > 0 的时候,power(x,n) = x * power(x,n-1) ,是不是感觉可以用递归做点什么!
def power(x,n):
if n == 0 :
return 1
else :
return x * power(x,n-1)
好吧,上面两个递归运算还没有理解递归的概念,没关系,还有一个!
# 使用python递归实现二分法查找
# 介绍:在有序的列表中,所要查找数据和中间数据比较。依次拆分,比较中间的数。
def search(list,number,lower,upper):
'使用二分法查找指定数据的索引,list 是排好序的列表,number 是查找的数据 lower,upper 指定查找的起始位置'
if lower == upper:
assert number == list[upper]
return upper
else :
middle = (lower + upper) // 2 # // 表示不留小数除
if number > list[middle] :
return search(list,number,middle+1,upper)
else :
return search(list,number,lower,middle)
说了以上这么多,对函数式编程的理解也是马马虎虎,用函数来编写程序 ?可能看到了 Python 中提供的这几个函数,能对函数式编程加深一下感觉。map filter reduce
给几个例子看一下
list(map(str,range(5))) # 与[srt(i) for i in range(5)] 等价
['','','','',''] # 可以使用 filter根据布尔函数的返回值对元素进行过滤
# 首先你得有一个可以返回布尔值的函数
def func(x):
return x.isalnum() # isalnum 方法检测字符串是否由字母或数字组成 seq = ['foo','x41','***','?!']
list(filter(func,seq))
['foo','x41'] # 同样的实现可以这么来
[x for x in seq if x.isalnum()] # 还有一种叫 lambda 表达式的玩意,是这样写的
filter(lambda x : x.isalnum(),seq) # lambda 表达式是一个匿名的函数,简单的理解,冒号前面是参数,冒号后面是方法体(返回值)
lambda x , y : x + y # 这就是表示有两个参数返回值是参数和的匿名函数呗! # 使用指定的函数将序列的前两个元素和二为一,再将结构与第三个元素和二为一,最终处理完序列得到一个结果。
numbers = [72,42,7,9,23,67,97,245]
from functools import reduce
reduce(lambda x,y:x+y,numbers)
# 当然,就这个案例来说,倒不如使用内置函数 sum 求和。
好吧,以上就是 Python 中函数相关的问题,至此,我们已经学习了 Python 的数据类型以及数据类型的常用操作,后便是语句,语句中牵扯到一些循环和条件判断语句的使用,而函数可以看成是对语句的简单抽象与封装,而真正的面向对象的思想还在下一节类的相关概念中。
推荐阅读:
Python 中的函数的更多相关文章
- Python中split()函数的用法及实际使用示例
Python中split()函数,通常用于将字符串切片并转换为列表. 一.函数说明: split():语法:str.split(str="",num=string.count(st ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python中range()函数的用法
python中range()函数可创建一个整数列表,一般用在for循环中. range()函数语法: range(start,stop[,step]) 参数说明: star: 计数从star开始.默认 ...
- python中format函数
python中format函数用于字符串的格式化 通过关键字 1 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字 2 grade = {'nam ...
- Python中readline()函数 去除换行符
从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n. 方法是使用strip()函数. 例子如下: f = open ...
- Python中int()函数的用法浅析
int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builti ...
- 【313】python 中 print 函数用法总结
参考:python 中 print 函数用法总结 参考:Python print() 函数(菜鸟教程) 参考:Python 3 print 函数用法总结 目录: 字符串和数值类型 变量 格式化输出 p ...
- python中filter函数
python中filter()函数 filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断 ...
- Python中print()函数不换行的方法
一.让print()函数不换行 在Python中,print()函数默认是换行的.但是,在很多情况下,我们需要不换行的输出(比如在算法竞赛中).那么,在Python中如何做到这一点呢? 其实很简单.只 ...
随机推荐
- OK6410 rmmod卸载模块失败:No such file or directory -- 转
原文地址:http://hi.baidu.com/andio/item/b8be9810282841433a176e86 rmmod chdir no such file or directory 说 ...
- 微服务深入浅出(5)-- 声明式调用Feign
Feign的使用 Feign采用了声明式的API接口的风格,将Java Http客户端绑定到它的内部,从而调用过程变的简单. 配置文件: spring: application: name: eure ...
- shell作业后台执行的方法
来思考几种场景: 1.某个脚本需要执行时间比较长,无人值守,可能执行过程中因ssh会话超时而中断? 2.某次测试一段代码,需要临时放入后台运行? 3.放入后台运行的脚本,需要在一段时间后重新调到前台? ...
- ASP.NET 应用生命周期19个事件简介
下面是请求管道中的19个事件. (1)BeginRequest: 开始处理请求 (2)AuthenticateRequest授权验证请求,获取用户授权信息 (3):PostAuthenticateRe ...
- 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...
- Nginx/LVS/HAProxy负载均衡软件的优缺点详解【转】
转自 (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均 ...
- Python-Web框架的本质
Web框架的本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. Python中使用socket和 ...
- Git如何设置多个用户
前言 由于我们在使用GitHub时,通常不希望带有公司信息,所以需要独立的Git账户来提交练习代码,本文记录一下如何配置多个Git账户并创建公钥 正文 1.首先进入~/.ssh文件夹 2.然后创建一个 ...
- 11 The Go Memory Model go语言内置模型
The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...
- ubuntu 16.04 网卡配置 虚拟机上网
看所有网卡(包括未启动的) ifconfig -a 或者 ip link 查看当前网卡配置,打开配置文件/etc/network/interfaces 设置静态IP(dhcp 为动态获取,static ...