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...'

       

 

posted @ 2018-09-06 08:55  wf-aiyouwei  阅读(1330)  评论(0编辑  收藏  举报