Python-函数--函数变量作用域--变量的引用--函数形参四大参数--函数返回值--动图处理

python函数

函数是组织好的,可重复使用的,用来实现单一,或者相关联功能的代码段
函数能提高应用的模块性,和代码的重复利用率,python中有很多内建函数,
但也可以自己创建函数叫做用户自定义函数。
函数的定义规则:
    1)函数代码块以def关键字开头,后接函数标示符号名称和圆括号()
    2)任何传入的参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
    3)函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明
    4)函数内容以冒号起始,并且缩进
    5)return [表达式]结束函数,选择性地返回一个值给调用方,不带表达式的return相当于返回None
语法:
def  函数名(参数):
    函数计算
    return

#实例:以下为一个简单Python,它将两个数计算总和
def sum_2_sum(num1,num2):
    result=num1+num2
    print '%d + %d = %d ' %(num1,num2,result)
    return result
a= sum_2_sum(2,5)
print a

函数变量的作用域

(1)局部变量

在函数内定义的普通变量,只在函数内部起作用函数执行结束后变量自动删除
(2)全局变量
global a;定义了一个全局变量a

a=1
print 'outside:',id(a)
def fun():
    global  a #声明a全局变量
    a=5
    print 'inside:',id(a)
fun()
print a
print id(a)
"""
输出结果:
outside: 14400616
inside: 14400520
5
14400520
注意:由于声明了全局变量就是整个程序生命周期内起作用
所以即使函数外输出a也为5
"""

变量的引用 

变量和数据都是保存在内存中的
在python中变量和数据时分开存储的,数据保存在内存中的一个位置,
而变量保存在数据在内存中的地址。因此变量中记录数据的地址,就叫做引用
使用id()函数可以查看变量中保存数据所在内存的地址
在python中函数的参数传递以及返回值都是靠引用传递的

def test(num):
    print '函数内部%d对应的内存地址是%d'%(num,id(num))
    result='hello'
    print '函数要返回的数据的内存地址是%d'%id(result)
    return result
a=10
print 'a变量保存数据的内存地址是%d'%id(a)
r=test(a)
print '%s的内存地址是%d'%(r,id(r))

函数形参之四大参数

参数:形参 实参
形参:位置参数 默认参数 可变参数 关键字参数
位置参数:形参和实参个数必须保持一致
def getInfo(name,age):
    print name,age
getInfo(age=12,name='Mary')
getInfo(12,'Mary')
#输出结果:
#Mary 12
#12 Mary
#一般按照顺序

#默认参数:形参和实参可以不一致
def mypow(x,y=2):
    #求x的y次方y的值默认
    print x**y
mypow(4)
#输出结果: 16
#默认参数的值可以改变
mypow(4,3)
#输出结果: 64


可变参数
def sum(*arg):
    sum=0
    for var in arg:
        sum+=var
    print sum
sum(1,2,3)
输出结果:6

#关键字参数

def getInfo(name,age,**kwargs):
    print name
    print age
    print kwargs
    return name,age,kwargs
getInfo('Mary',18,hobbies=['code','swimming'])

函数的返回值

返回值:函数运算的结果,还需要进一步的操作时,给一个返回值
return用来返回函数执行的结果的,如果没有返回值,默认为None
python可以间接返回多个值(返回了一个元组)
一旦遇到return ,函数执行结束,后面的代码不会执行
def mypow(x,y=2):
    return x**y
    print 'hello'
# a=mypow(2)
# print a+1

#对元组进行解包
a,b=mypow(3)
print a,b
练习一:
编写一个名为collatz()函数,它有一个名为number的参数
    1)如果参数是偶数,那么collatz()就打印出Number//2
    2)奇数,打印3*number+1
def collatz(number):
    # if number%2==0:
    #     print number//2
    # else:
    #     print 3*number+1
    print number//2 if number%2==0 else 3*number+1
collatz(4)
模拟轮盘抽奖游戏:
轮盘分为三部分:一等奖,二等奖和三等奖
轮盘转的时候是随机的,
    如果范围在[0,0.08)之间,代表一等奖,
    如果范围在[0.08,0.3)之间,代表二等奖,
    如果范围在[0.3,1.0)之间,代表三等奖,
模拟本次活动1000人参加,模拟游戏时需要准备各等级奖品的个数
import random
rewardDict={
    '一等奖':(0,0.08),
    '二等奖':(0.08,0.3),
    '三等奖':(0.3,1)
}
def rewardFun():
    """用户得奖等级"""
    #生成一个0~1之间的随机数
    num=random.random()
    #判断随机转盘转的数是几等奖
    for k,v in rewardDict.items():
        if v[0]<=num<v[1]:
            return k
resultDict={}
for i in range(1000):
    #res: 本次转盘的等级
    res=rewardFun()
    if res not in resultDict:
        resultDict[res]=1
    else:
        resultDict[res]=resultDict[res]+1
for k, v in resultDict.items():
    print k,'---->',v
题目需求:
    对于一个十进制的正整数,定义f(n)为其各位数字的平方和,如:
    f(13)=1**2+3**2
    f(207)=2**2+0**2+7**2
    下面给出三个正整数K,a,b,你需要计算由多少个正整数n满足a<=n<=b,
    且k*f(n)=n
输入:
    第一行包含3个正整数k,a,b,k>=1,a,b<=10**18,a<=b;
输出:
    输出对应的答案:
范例:
    输入:51 5000 10000
    输出:3
def f(n):
    #1.先把数字转换为字符串
    n=str(n)
    #2.计算字符串中每个数的平方
    sum =0
    for i in n:
        sum += int(i) ** 2
    return sum
#1.接受变量
s=raw_input('请输入(k,a,b):')
li=[]
for item in s.split():
    li.append(int(item))
k,a,b=li
#2.进行判断是否满足条件
count = 0
for i in range(a,b+1):
    if k*f(i)==i:
        count += 1
print count

列表生成式

s = '51 5000 10000'
# li = []
# for item in s.split():
#     li.append(int(item))
# k, a, b = li
k,a,b=[int(item) for item in s.split()]
print k,a,b
2.生成一个列表,列表元素
li=[]
for i in range(1,8):
    li.append(i**2)
print li

print [i**2 for i in range(1,8)]
"""
[expersion for i in 序列 range(1,8)]
"""
print [i**2 for i in range(1,8) if i%2==0]

1.找出1~10之间的所有偶数,并且返回一个列表(包含以这个偶数为半径的圆的面积)
import math

print [math.pi * r * r for r in range(2, 11, 2)]
# 2.找出1~10所有奇数,并且返回一个列表(所有奇数转换为字符串)
print [str(i) for i in range(1, 10, 2)]


# 3.找出1~num之间的所有质数
def isPrime(num):
    for i in range(2, num):
        if num % i == 0:
            return False
    else:
        return True
print [i for i in range(2,101) if isPrime(i)]

动图处理

import  random
from PIL import Image,ImageSequence
with Image.open('cat.gif') as im:
    print (im.is_animated,im.a_frames)
    #判断图片是否为动图
    if im.is_animated:
        frames=[f.copy() for f in ImageSequence.Iterator(im)]
        #对列表进行反转
        frames=frames[::-1]
        frames[0].save('out.gif',save_all=True,append_image=frames[1:])

 

猜你喜欢

转载自blog.csdn.net/weixin_40460156/article/details/82287906