第一节:调用函数

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. SpringMvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  2. python 下载小说

    以下载官场风月小说为例: 具体代码: # coding=utf-8 import os import re from selenium import webdriver from selenium.c ...

  3. 从C转到JAVA学习路之struct与class对比(转)

    转自:http://blog.csdn.net/andywxf01/article/details/53506549 JAVA里最牛B的最基本的就是类,而C语言中的struct也可以定义自己的数据结构 ...

  4. 一张图片教会你写mysql 语句

    MySQL的语句执行顺序 MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入 ...

  5. Django—— 缓存框架

    译者注:1.无用的,吹嘘的说辞不翻译:2.意译,很多地方不准确. 动态网站最为重要的一点就是好,网页是动态的.每一次用户请求页面,网站就要进行各种计算——从数据库查询,到render模板,到各种逻辑运 ...

  6. SqlServer--百度百科

    SQL是英文Structured Query Language的缩写,意思为结构化查询语言.SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标准协会)的规定,SQL被作为 ...

  7. Linux如何根据UUID自动挂载磁盘分区

    一般服务器都有多个硬盘分区,在重启后,这些分区的逻辑位置加载时可能会发生变动,如果使用传统的设备名称(例如:/dev/sda)方式挂载磁盘,就可能因为磁盘顺序变化而造成混乱. Linux环境中每个Bl ...

  8. Ubuntu——修正LibreOffice中文乱码以及eclipse提示框颜色

    刚进ubuntu的时候就老遇到用libreoffice打开某些文档时出现一堆叠在一起的乱码.以及最開始使用eclipse编辑时,鼠标放到一个变量或者函数时 弹出来一黑框框-看的难受的.... 这里记录 ...

  9. 简单模拟Spring的注入

    主要就是读XML技术和反射技术. 在xml中读出相关配置信息,然后利用反射将其实例化为对象,并调用其构造方法,在实例化的过程中将属性注入实例. 实例化和属性注入这些操作都交给了框架,不再需要自己的去n ...

  10. SSM&SSH项目中 springmvc 乱码问题解决

    需要在web.xml文件中配置过滤器: <!-- 过滤器 过滤乱码 --> <filter> <filter-name>characterEncodingFilte ...