第一节:调用函数

1.函数是什么?

  函数是组织好的,可以重复利用的。

2.为什么要用到函数?

  提高应用的模块性,提高重复利用率。指的是:多个文件中可能都要用到该函数,直接拿来调用就行,不用在重复写一个。

3.py中怎么用?

  函数是代码抽象的一种方式,只有把底层的抽象成用户一看便知,才能达到高级语言的层次。所以,函数就是一种抽象。就是说:用户一看便知该函数会实现什么样的功能。

4.函数的分类:

  内函数:语言自己内置的一些函数;比如:abs();max();min();

  外函数:用户子自己定义的函数

注解:如果把一个函数赋给一个变量,那么这个变量就有了这个函数的功能。举例:a = abs;a(-1);

5.数据类型转换

  int();float();str();bool()

小结:调动Python函数的时候,要根据函数的定义,传入正确的参数,如果函数调用出错,要学会看错误信息。

第二节:定义函数

1.语法:在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

2.举例:

求绝对值函数
def my_abs(x):
if x >= 0:
print(x)
else:
print(-x) my_abs(-2)

3.空函数:什么也不做的函数,叫做空函数,用pass来实现

举例:

def  nop():
pass  

举例:

age = 8
if age>=18:
pass#代码块可以先占用着,等需要写的时候在写上即可  

举例:

def my_abs(x):
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x >= 0:
print(x)
else:
print(-x)
my_abs('w')

4.函数返回多个值

举例:

import math
def move(x,y,step,angele = 0):
nx = x + step*math.cos(angele)
ny = y + step*math.sin(angele)
print(nx,ny) move(100,100,60,math.pi/6)

注解:python函数返回多个值的时候返回的是一个tuple。  

小结:

  定义函数时,需要确定函数名和参数个数;

  如果有必要,可以先对参数的数据类型做检查;

  函数体内部可以用return随时返回函数结果;

  函数执行完毕也没有return语句时,自动return None

  函数可以同时返回多个值,但其实就是一个tuple。

举例:

请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程,ax2 + bx + c = 0的两个解。

import math
def quadratic(a, b, c):
x1 = (-b + math.sqrt(b*b-4*a*c))/2*a
x2 = (-b + math.sqrt(b*b-4*a*c))/2*a
print(x1,x2)
quadratic(1,-1,0) 

以上考虑的因素太少,更标准的写法:

import math
def quadratic(a,b,c):
if(a==0):
print('参数错误,请重新输入')
else:
delta = b*b -4*a*c
if(delta > 0):
x1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 * a
x2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 * a
print('该方程有两个不同的实根:x1 = %s x2 = %s' % (x1,x2)) elif(delta == 0):
x1 = -b/2*a
x2 = -b/2*a
print('该方程有两个相同的实根:x1=x2=%s' % (x1,x2))
else:
print('该方程没有实根')
quadratic(1,2,1)  

小结:函数就是把具体的功能给封装起来,然后使用者直接调用即可,不用知道函数中的细枝末节。

第三节:函数的参数

  位置参数:

def power(x):
print(x*x)
power(2)

  更具体一些的位置参数:

def power(x,n):
s = 1
while n >0:#产生循环
n = n-1#修改n的值
s = s * x#只要符合条件就执行本条语句
print(s)#当循环执行完后就执行这条语句
power(2,3)  

注解:位置参数有位置限制,顺序不可颠倒。

  默认参数:

  举例:

def power(x,n=2):#可以给默认参数一个默认的值
s = 1
while n >0:#产生循环
n = n-1#修改n的值
s = s * x#只要符合条件就执行本条语句
print(s)#当循环执行完后就执行这条语句
power(4)

 设置默认参数时的注意事项:

1.必选参数在前,默认参数在后。

2.如何设置默认参数:当函数有多个默认参数时,把变化大的参数放前面,变化小的参数放后面,变化小的参数可以作为默认参数。

3.使用默认参数的优势:降低调用函数的难度。 

注意:默认参数必须指向不变对象!

注意:为什么要设计strNone这样的不变对象呢?

  因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。    

  可变参数:

  定义:传入的参数是可以变化的,可以是1个,2个...............还可以是0个

  举例:

def calc(*numbers):#可变参数
sum = 0
for x in numbers:
sum = sum+ x*x
print(sum)
nums = (1,2,3)
calc(*nums)

  关键字参数:

  举例:

def person(name,age,**kw):
print('name:',name,'age:',age,'other:',kw)
person('李XX',23,city = 'shanghai',sex = '男')

  注解:**kw将是一个字典dict

  命名关键字参数:主要用来限制参数中的名字。

  举例:

def person(name,age,*,ciyt,job):
print(name,age,ciyt,job)
person('xxx',34,ciyt='chaoyang',job= 'eng')  

注解:

1.和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。

2.如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

3.使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数:

  参数组合:

  1.在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

小结:

  ython的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

  默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

  要注意定义可变参数和关键字参数的语法:

  *args是可变参数,args接收的是一个tuple;

  **kw是关键字参数,kw接收的是一个dict。

  以及调用函数时如何传入可变参数和关键字参数的语法:

  可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))

  关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})

  使用*args**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

  命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

  定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。

第四节:递归函数

第二章----python函数的更多相关文章

  1. [Python笔记][第二章Python序列-tuple,dict,set]

    2016/1/27学习内容 第二章 Python序列-tuple tuple创建的tips a_tuple=('a',),要这样创建,而不是a_tuple=('a'),后者是一个创建了一个字符 tup ...

  2. [Python学习笔记][第五章Python函数设计与使用]

    2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...

  3. [Python笔记][第二章Python序列-复杂的数据结构]

    2016/1/27学习内容 第二章 Python序列-复杂的数据结构 堆 import heapq #添加元素进堆 heapq.heappush(heap,n) #小根堆堆顶 heapq.heappo ...

  4. [python笔记][第二章Python序列-list]

    2016/1/27学习内容 第二章 Python序列-list list常用操作 list.append(x) list.extend(L) list.insert(index,x) list.rem ...

  5. 第二章Python入门

    第二章 Python入门 2.1.简介 Python是著名的"龟叔"(Guido van Rossum)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言 Pytho ...

  6. 第二章 python基础(一)

    第一节 Python文件类型 源代码 Python源代码的文件以“py”为扩展名,由Python程序解释,不需要编译 字节代码 Python源文件经编译后生成的扩展名为“pyc”的文件 编译方法 im ...

  7. 算法导论 第一章and第二章(python)

    算法导论 第一章 算法     输入--(算法)-->输出   解决的问题     识别DNA(排序,最长公共子序列,) # 确定一部分用法     互联网快速访问索引     电子商务(数值算 ...

  8. CSAPP第二章show_bytes函数的探究

    CSAPP第二章中给出了一个帮助我们观察数据的位模式的函数--show_bytes函数,具体实现如下: #include<stdio.h> typedef unsigned char *b ...

  9. 第二章 python基础(二)

    第九节 函数 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字. 可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句. ...

随机推荐

  1. Unity Low-level Native Plugin Interface

    https://docs.unity3d.com/Manual/NativePluginInterface.html 拿unity底层graphics device

  2. 【招聘App】—— React/Nodejs/MongoDB全栈项目:信息完善&用户列表

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

  3. REOBJECT structure

    REOBJECT structure   包含丰富编辑控件中的OLE或图像对象的信息. Syntax 语法 typedef struct _reobject { DWORD cbStruct; LON ...

  4. [TypeScript] Dynamically Allocate Function Types with Conditional Types in TypeScript

    Conditional types take generics one step further and allow you to test for a specific condition, bas ...

  5. ActiveMQ实现负载均衡+高可用部署方案 -转载

    转:http://www.open-open.com/lib/view/open1400126457817.html 一.架构和技术介绍 1.简介 ActiveMQ 是Apache出品,最流行的,能力 ...

  6. Spring搭配Ehcache实例解析

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/50538085 本文出自[我是干勾鱼的博客] 1 Ehcache简单介绍 EhCa ...

  7. 查看FC HBA卡信息的方法

    在配置磁盘阵列或虚拟磁带库时,往往会以FC接口与主机对接,那么就涉及FC HBA卡的查看,本文就这个问题进行了总结与整理. 一.Windows 系统 在Windows系统中,可以使用FC HBA卡厂家 ...

  8. ExCEL操作技巧集锦,持续更新

    1.格式刷 word里面格式化的快捷键很好用,但是excel里面的快捷键用不了,经百度得知: excel双击格式化按钮,可以开启连续应用格式刷模式,单击之后关闭,这样比快捷键好用多了,如下图

  9. c++ 类内部 使用 new delete

    低级错误: /** * @clusterNums 默认为5 分类数目 * @xyVector 处理后点云数据 x y顺序存储 */ int GMM::runGMM(int clusterNums, c ...

  10. unity, Invoke延迟执行

    参考:http://blog.christianhenschel.com/2013/05/15/how-to-do-delayed-function-calls-in-unity3d-one-line ...