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:])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章