学了 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 入门之基本数据类型

Python 中的语句

Python 中的函数的更多相关文章

  1. Python中split()函数的用法及实际使用示例

    Python中split()函数,通常用于将字符串切片并转换为列表. 一.函数说明: split():语法:str.split(str="",num=string.count(st ...

  2. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  3. python中range()函数的用法

    python中range()函数可创建一个整数列表,一般用在for循环中. range()函数语法: range(start,stop[,step]) 参数说明: star: 计数从star开始.默认 ...

  4. python中format函数

    python中format函数用于字符串的格式化 通过关键字 1 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字 2 grade = {'nam ...

  5. Python中readline()函数 去除换行符

    从Python中readline()函数读取的一行内容中含有换行符\n,很多时候我们需要处理不含有换行符的字符串,此时就要去掉换行符\n. 方法是使用strip()函数. 例子如下: f = open ...

  6. Python中int()函数的用法浅析

      int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int)  Help on class int in module __builti ...

  7. 【313】python 中 print 函数用法总结

    参考:python 中 print 函数用法总结 参考:Python print() 函数(菜鸟教程) 参考:Python 3 print 函数用法总结 目录: 字符串和数值类型 变量 格式化输出 p ...

  8. python中filter函数

    python中filter()函数   filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断 ...

  9. Python中print()函数不换行的方法

    一.让print()函数不换行 在Python中,print()函数默认是换行的.但是,在很多情况下,我们需要不换行的输出(比如在算法竞赛中).那么,在Python中如何做到这一点呢? 其实很简单.只 ...

随机推荐

  1. Lucene之Java实战

    1.导包 2.索引的创建 2.1首先,我们需要定义一个词法分析器. Analyzer analyzer = new IKAnalyzer();//官方推荐 Analyzer analyzer = ne ...

  2. ashx误删后,未能创建类型

    描述 今天,因为临时有事儿,需要去一趟其他城市,项目比较赶.所以只能在车上继续敲代码,倒霉的触摸板让我误删一个ashx一般处理程序.好死不死的这个文件的代码还很长. 我的做法是[垃圾桶]→[还原]→V ...

  3. 1.phpcms的安装和卸载文件

    一.安装文件 ①languages文件夹 语言包:zh-cn\order.lang.php //样式<?php $LANG['order_new'] = '订单管理'; ?> ②templ ...

  4. 训练赛第一场D题

    解题报告:一开始不知道ATA的意思,后来才知道原来是转置矩阵乘以原来的矩阵.这题说起来比较麻烦就不说了,直接上代码: #include<cstdio> #include<cstrin ...

  5. 18、Random类简介

    Random类概述 Random类在java.util包下,使用这个类可以生成随机数 package com.sutaoyu.usually_class; import java.util.Rando ...

  6. scrapy 爬虫踩过的坑(II)

    同事写了个爬虫,逻辑上看着没什么问题,但是一直报错:Request url must be str or unicode…… 打印了一下url 和url 的类型,确实是 unicode 懵逼…… 打印 ...

  7. [转]std::set、自定义类型与比较函数

    转自:http://www.189works.com/article-42025-1.html 怎样在set中放入自定义类型?这个问题通过谷歌就可以得到不少答案:1.定义一个函数对象并在定义set的时 ...

  8. 从Runoob的Django教程学到的

    Windows 10家庭中文版,Python 3.6.4,Django 2.0.3 这个月开始学习Django,从网上找到了RUNOOB.COM网站找到了一份Django教程,在“认真”学习之后,初步 ...

  9. git —— 异常1,index.lock

    git提交过程中出现的问题 解决方法:找到 index.lock文件将其删除 一般 index.lock 在.git下面, 有时 .git 是隐藏的,但是无论怎样, 可以通过 everything 找 ...

  10. SQL Server存储过程的删除方法

    SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...