第一节:调用函数

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. JavaWeb过滤器验证登录(避免未经登录进入主页)

    今天用ssh2写了个简单的系统,发现了一个问题,我这系统必须先登录成功才能进入主页,但我在浏览器里直接输入主页地址,发现也能进入,这个肯定不好,毫无安全性可言,后经查资料发现需要登录过滤器,就试了下, ...

  2. elasticsearch term 查询二:Range Query

    Range Query 将文档与具有一定范围内字词的字段进行匹配. Lucene查询的类型取决于字段类型,对于字符串字段,TermRangeQuery,对于数字/日期字段,查询是NumericRang ...

  3. 手写一个死锁Demo

    相互持有对方锁,导致死锁 package jesse.test04; public class DeadLockSample extends Thread{ private String first; ...

  4. Python中lambda使用简易教程

    例如: f = lambda x: x+x #lambda后的x为参数 print f(3) >>6 等价于 def func(x): return x+x print func(3) 与 ...

  5. Android实现批量照片上传至server,拍照或者从相冊选择

    近期因为项目需求,须要完毕批量照片上传,折腾了一段时间,最终完毕了,达到了例如以下效果 主界面主要有GridView组成和button组成,当按下一个格点时,会调用相机或者相冊,拍照或者选择相冊照片, ...

  6. [HTML5] Render Hello World Text with Custom Elements

    Custom elements are fun technology. In this video, you will learn how to set one up and running in l ...

  7. 可伸缩Web架构与分布式系统(1)

    开源软件近年来已变为构建一些大型网站的基础组件.并且伴随着网站的成长,围绕着它们架构的最佳实践和指导准则已经显露.这篇文章旨在涉及一些在设计大型网站时需要考虑的关键问题和一些为达到这些目标所使用的组件 ...

  8. unity3D克隆50个游戏对象并输出Json格式的文本

    http://wenku.baidu.com/link?url=tl8q_aj1n-U267XkKtSZISaw6jKJ1woh4CJkDUr1AwEzllSAv7P0r7cawXXSyDVXNf6m ...

  9. XML之Schema

    前面学习了DTD.相同我们有了一套更完好的定义法则-Schema. 以下环绕Schema是什么.为何用以及怎么用谈谈自己的感受. XML Schema是基于XML的DTD替代者. XML Schema ...

  10. Android Exception 16(Error in ADT 23 Update)

    http://stackoverflow.com/questions/24445367/error-in-adt-23-update http://stackoverflow.com/question ...