Python—函数
###python的函数###
1.函数的定义
如果不主动调用函数,函数是不会执行的
def say_hello(): ##定义函数
print 'hello'
print 'wangfang'
say_hello() ##函数的调用
#定义函数时的变量,叫形参 形参可以任意取名
def sum_2_sum():
num1 = 10
num2 = 10
result = =num1 + num2
print '%d + %d = %d' %(num1,num2,result)
#在调用函数的时候传递的参数称为实参(真实的数据信息)
sum_2_sum(5,20)
"""
函数参数的使用:
在函数名后面的小括号内填写 参数
多个参数之间用 ,分隔开
"""
练习题:
编写一个名为collatz()的函数,它有一个名为number的参数
-如果参数是偶数,那么collatz()就打印出number//2.
-如果参数是奇数,那么collatz()就打印出3*number+1.
2.函数形参之四大参数
参数:形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
#位置参数:形参和实参个数必须保持一致
def inform(name,age):
print name
print age
inform('wf',20)
#但是如果我输入的name,age位置互换
# 程序不会报错,此输出错误
inform(18,'wang')
#为了能够正确输出可以这样写
inform(name='fang',age=18)
#默认参数:形参和实参的个数可以不一致 默认形参可以改变
def mypow(x,y=2):
print x**y
#这个y如果用户没有输出
#默认就是y=2
#会有输出的值,但是提供给我们用的pow()函数
#如果输入的形参和实参个数不一致的话,会报错
mypow(2)
#默认的值是可以修改的
mypow(2,3)
#可变参数:利用 *args:是可变参数
*args:是元组类型的数据
*args:名字可变(因为是形参 名字可变)
def mysum(*args):
print args
sum = 0
for i in args:
sum += i
print sum
mysum(1,2,3)
#对列表,元组,集合接解包,只需要在变量前加*
num = [1,2,3]
num1 = {1,2,3}
num2 = (1,2,3)
#解包
mysum(*num1)
mysum(*num)
mysum(*num2)
就比如,本来的sum求和,需要一个范围,我想定义一个我自己的sum函数,但是用户输入的数值是不一定的,所以就要用到可变参数
#关键字参数:**kwargs:是一个字典;可以传递任意多的key—value对
def student(name,age,**kwargs):
print name
print age
print kwargs
student('wang',20,habbies=['running'])
3.函数的返回值
返回值:函数运算的结果,如果还需要进一步操作的时候,
就需要给函数写入一个返回值return
rerutn用来返回函数执行的结果。如果没有返回值,默认为None
python可以间接的返回多个值(即,返回了一个元组)
一旦遇到return,将函数的执行结果返回后,后面的代码就不会执行
def mypow(x, y=2):
return x ** y
print 'hello'
a = mypow(3)
print a ##输出 9
def mypow1(x, y=2):
return x ** y, x + y
print 'hello'
b = mypow1(3)
print b ##输出 (9,5)
c.d = mypow1(3)
print c,d ##输出 9 5 这个相当于对元组解包
4.函数变量的作用域
局部变量:在函数内部定义的普通变量,只在函数内部作用
函数执行完成之后,变量会自动删除
全局变量
a = 10 ##这个变量是全局变量
print 'outside:',id(a)
def fun():
a = 5 ##这个变量是局部变量
print 'inside:',id(a)
fun() ##调用函数
print a
print id(a)
a = 10
print 'outside:',id(a)
def fun():
global a ##声明 a 是全局变量
a = 5
print 'inside:',id(a)
fun() ##调用函数,下面的a才会是fun()函数里改变的值
print a ##如果没有调用,函数没有执行,a没有被更改
print id(a)
5.函数的引用
a = 10 #系统在内存中a开辟了一个空间,在空间中填入的是 10 这个数字的地址值,就相当于,a指向了10这个数据
a = 20 #将原本 10 的地址值用 20 的地址值替换,就相当于 a改变了指向
注意:alt + enter 如果刚开始没有导包的话,按这两个键然后就会自动导入包
练习题:
(1)编写一个函数calculate
-可以接受任意多个数,返回的是一个元组
-元组的第一个数,是所有的参数的平均值
-第一个参数是大于平均值的所有数
(2)编写函数
-接收一个列表(包含30个随机生成的整形数)和一个整形数K
-返回一个新的列表
-要求:
--将列表下标K之前的元素逆序
--将下标K之后的元素逆序
--如:[1,2,3,4,5]2 [2,1,5,4,3]
结果:
(3)模拟轮盘抽奖游戏
-分为三部分:一等奖,二等奖和三等奖
-转盘转的时候是随机的
---如果范围在[0,0.08)之间,代表一等奖;
---如果范围在[0.08,0.3)之间,代表二等奖;
---如果范围在[0.3,1)之间,代表三等奖;
-模拟本次活动1000人参加,模拟游戏时需要准备各等级奖品的个数
结果:
(4)对于一个十进制的正整数,定义f(n)为其各位数字的平方和
-如:f(13)=1**2+3**2=10
-下面给出三个正整数k,a,b,你需要计算有多少个正整数n满足 a <= n <= b
-且 k*f(n)=n
-输入:51 5000 10000
-输出:3
(5)编写一个函数,接受一个字符串参数,返回一个元组,
-‘hello WORLD’
-元组第一个值为大写字母的个数,第二个值为小写字母的个数
(6)打字软件正确率
-编写函数,计算字符串匹配的准确率
-orginstr为原始内容,userstr为用户输入的内容
6.列表生成式
s = '51 5000 10000'
li = []
for i in s.split():
li.append(int(i))
k,a,b = li
列表生成式:print k,a,b = [int(i) for i in s.split()]
(1)生成一个列表,列表元素分别为[1**2,2**2,3**2,4**2,...<n**2]
li = []
for i in range(1,8):
li.append(i**2)
print li
列表生成式:print [i**2 for i in range(1,8)]
(2)找出1~10之间的所有的偶数,并且返回一个列表(包含以这个偶数为半径的圆的面积)
import math ##这个是关键,要导入数学的包,才能用 pi
li = []
for r in range(2,11,2):
square = math.pi * r * r
li.append(square)
print li
列表生成器: print [math.pi*r*r for r in range(2,11,2)]
(3)找出1~10之间的所有奇数,并且返回一个列表(所有的奇数转换为字符串)
列表生成器:print [str(i) for i in range(1,11,2)]
(4)找出1~num之间的所有质数
def isPrime(num):
for i in range(2,num):
if num % 2 ==0:
return False
else:
return True
print [i for i in range(2,num) if isPrime(i)]
(5)给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并且输出结果。
-输入值小于1000
-例如:输入10,程序应该输出结果为2
-共有两对质数的和为10,分别为(5,5)和(3,7)
7.字典生成式
(1)假设有20个学生,学分在60~100之间,筛选出成绩在90分以上的学生
import random
student = {}
for i in range(20):
name = 'westos' + str(i)
score = random.randint(60,100)
student[name] = score
或者:
student['westos'+str(i)] = random.randint(60,100)
print student
highscore = {}
for name,score in student.items():
if score > 90:
highscore[name] = score
print highscore
或者:
print {name:score for name,score in student.items() if score >90}
(2)将字典中的key和value值调换
d = {'a':'apple','b':'bob','c':'cat'}
print {v:k for k,v in d.items()}
8.函数的装饰器
在不改变原函数的基础上,给函数增加功能
把一个函数当作参数,返回一个替代版的函数
本质上:返回函数的函数
示例1:
def func1():
print 'have a nice day!'
def func2():
print 'good luck!'
def outer(func):
def inner():
print '**********'
func()
return inner()
func1 = outer(func1)
func1() ##调用
示例2:
def say(age):
print 'man is %d years old' %age
def outer(func):
def inner(age):
if age < 0:
age = 0
func(age)
return inner
say = outer(say)
9.函数的语法糖
def desc(fun):
def add():
print '中秋快乐!'
print '西开欢迎你!'
return add
@desc ##语法糖
def login():
print 'login...'
@desc ##语法糖
def logout():
print 'logout...'