內容選單標籤

2019年11月20日 星期三

CH8 函數

----------------------- 區域變數Local Variable 和 全域變數Global Variable

global_list=[1,2,3,4,]

def runvar(local_list=global_list):        #同一個位置,所以local_list 跟global_list 同
    print(local_list)
    local_list.append(5)

runvar()
print(global_list)


[1, 2, 3, 4]
[1, 2, 3, 4, 5]




x=10           #全域變數
y=20           #全域變數
lista=[]        #全域變數

def showvar():
    global y,lista
    listb=[5,4,3,2,1]        #區域變數
    lista=listb
    y=10
 
    lista.append(6)
    print('showvar=',lista)


def localvar():
    y=30                #區域變數
    z=40                #區域變數
    print('x=',x)
    print("localvar 區域 y=",y)
    print("localvar 全域 lista=",lista,'\n')


print("main x=",x)                #全域變數
showvar()
localvar()
print("main y=",y)
print("main lista=",lista)


main x= 10
showvar= [5, 4, 3, 2, 1, 6]
x= 10
localvar 區域 y= 30
localvar 全域 lista= [5, 4, 3, 2, 1, 6]

main y= 10
main lista= [5, 4, 3, 2, 1, 6]








----------------------- 8.4 程序
函數 function:
y=f(x) y 會隨 x 改變而改變
f(x):函數
x:引數 argument 會被帶到函數中運算,把結果放到函數名字中帶回

程序 procedure:
可以沒有引數,在程式中做運算,由於這運算在程式中執行多次,所以把它定義成程序,有需要再呼叫使用




>>> dir(time)
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'thread_time', 'thread_time_ns', 'time', 'time_ns', 'timezone', 'tzname']


>>> help(time.perf_counter)
Help on built-in function perf_counter in module time:
perf_counter(...)
    perf_counter() -> float 
    Performance counter for benchmarking.

>>> help(time.time)
Help on built-in function time in module time:
time(...)
    time() -> floating point number 
    Return the current time in seconds since the Epoch.
    Fractions of a second may be present if the system clock provides them.





import time
def procedure():
    time.sleep(2.5)

t0=time.perf_counter()
print("計時開始:")
procedure()
print(time.perf_counter()-t0)

t1=time.time()
procedure()
print(time.time()-t1)


計時開始:
2.503089078        #因 print("計時開始:") ,所以比下面多0.00308...秒
2.5



def procedure():
    print("這是程序")
    a=10+20
    print(a)

procedure()


這是程序
30












----------------------- 常用外部套件

sys 模組
math 模組
random 模組
array 模組
time 模組
numpy 模組




>>> import math
>>> math.pi
3.141592653589793


>>> dir(math)        #有那些涵數
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']


>>> help(math.pow)
Help on built-in function pow in module math:

pow(x, y, /)
    Return x**y (x to the power of y).

>>> 4**2
16
>>> math.pow(4,2)
16.0



>>> 4^2        #位元運算  XOR 互斥或
6
>>> 5^4
1


>>> math.sqrt(16)
4.0
>>> math.floor(3.14)
3
>>> abs(-2)
2
>>> math.fabs(-2)
2.0

>>> math.fmod(5,3)
2.0
>>> 5%3
2








>>> import random
>>> random.seed(10)        #改變隨機數產生器的種子
>>> random.randint(1,100)        #隨機產生1~100間整數
74


>>> random.randrange(10,50)        #10~50 挑選出一個亂數
37

>>> random.uniform(1,10)        #1~10 產生一個實數亂數
5.3430550709577025


>>> random.random()        #0~1 產生一個實數亂數
0.014832446024553692



>>> random.choice('abcdefg!@#$%')        #隨機字元
'!'


>>> a=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
>>> random.sample(a,5)        #從 list a 中取出5個不重複的數
[14, 8, 5, 11, 3]








>>> import time
>>> localtime=time.localtime(time.time())
>>> print('本地時間:',localtime)
本地時間: time.struct_time(tm_year=2019, tm_mon=11, tm_mday=21, tm_hour=9, tm_min=8, tm_sec=10, tm_wday=3, tm_yday=325, tm_isdst=0)

>>> print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
2019-11-21 10:09:14

>>> print(time.strftime("%a %b %d %H:%M:%S:%Y",time.localtime()))
Thu Nov 21 10:10:29:2019


#格式字串符轉換為時間戳
>>> a='Thu Nov 21 10:10:29:2019'
>>> print(time.mktime(time.strptime(a,"%a %b %d %H:%M:%S:%Y")))
1574302229.0





>>> from datetime import date        #datetime 套件  date 模組
>>> today=date.today()                   #date 物件  today() 函數
>>> today
datetime.date(2019, 11, 21)


>>> my_birthday=date(2000,1,1)
>>> my_birthday
datetime.date(2000, 1, 1)
>>> days=abs(my_birthday-today)
>>> print(days)
7264 days, 0:00:00




>>> from datetime import datetime,date,time        #從datetime 物件 呼叫 其中3個模組
>>> d=date(2000,1,1)        #函數
>>> t=time(12,30)
>>> datetime.combine(d,t)
datetime.datetime(2000, 1, 1, 12, 30)


>>> datetime.now()
datetime.datetime(2019, 11, 21, 9, 26, 54, 426221)



#算天數
>>> from datetime import datetime
>>> date_format='%m/%d/%Y'
>>> a=datetime.strptime('1/1/2000',date_format)
>>> b=datetime.strptime('3/1/2019',date_format)
>>> delta=b-a
>>> print(delta.days)
6999



>>> dt=datetime.strptime('24/11/18 12:30','%d/%m/%y %H:%M')
>>> dt
datetime.datetime(2018, 11, 24, 12, 30)

>>> tt=dt.timetuple()
>>> for i in tt:
print(i)


2018        #年
11        #月
24        #天
12        #時
30        #分
0        #秒
5        #周 (0=Monday)
328        #自1月1日以來的天數
-1        #dst -method tzinfo.dst() returned None






>>> import calendar
>>> cal=calendar.month(2019,1)        #輸出2019年 1月份的日曆
>>> print(cal)
    January 2019
Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31



>>> import datetime
>>> i=datetime.datetime.now()
>>> print("當前的日期和時間是 %s" %i)
當前的日期和時間是 2019-11-21 10:20:33.948829

>>> print("ISO 格式的日期和時間 %s" %i.isoformat())
ISO 格式的日期和時間 2019-11-21T10:20:33.948829

>>> print("當前的年份是 %s" %i.year)
當前的年份是 2019
>>> print("當前的月份是 %s" %i.month)
當前的月份是 11
>>> print("當前的日期是 %s" %i.day)
當前的日期是 21

>>> print("當前小時是 %s" %i.hour)
當前小時是 10
>>> print("當前分鐘是 %s" %i.minute)
當前分鐘是 20
>>> print("當前秒是 %s" %i.second)
當前秒是 33

>>> print("dd/mm/yyyy 格式是 %s/%s/%s" %(i.day,i.month,i.year))
dd/mm/yyyy 格式是 21/11/2019
















----------------------- 自訂函數


def sum(n):
    s=0
    for i in range(s,n+1):
        s=s+i
    return s

print(sum(100))

5050


#費氏數列
def fib(n):
    a,b=0,1
    while a<n:
        print(a,end='  ')
        a,b=b,a+b
    print()
 
fib(1000)

0  1  1  2  3  5  8  13  21  34  55  89  144  233  377  610  987






----------------------- 字串函數
>>> chr(65)
'A'
>>> ord('A')
65

>>> a=123
>>> b='456'
>>> a+int(b)
579
>>> str(a)+b
'123456'

>>> len('guochin')
7

>>> 'guo'.center(10)        #傳回指定長度的字串,字串置中
'   guo    '

>>> 'guo'.find('g')        #字元第1次出現的索引
0
>>> 'guo'.find('u')
1

>>> 'Python is easy'.endswith('easy')       #判斷是否以指定的字串結束
True


>>> 'chinku'.upper()
'CHINKU'
>>> 'CHINKU'.lower()
'chinku'


>>> repr(65)        #輸出的字符加上引號
'65'
>>> repr('ku')
"'ku'"
>>> repr("ku")
"'ku'"


>>> str='abcdef'        #擷取
>>> str[2:5]
'cde'


>>> 'good'.replace('o','e')        #取替
'geed'


>>> 'good dog'.count('o')
3


>>> '12'.ljust(5,'0')        #對齊,餘補上指定字元
'12000'
>>> '12'.rjust(5,'0')
'00012'


>>> ' abc '.strip()        #去除前後空白
'abc'


>>> 'qqqabchhh'.rstrip('h')        #刪除左、右指定字元
'qqqabc'
>>> 'qqqabchhh'.lstrip('q')
'abchhh'



>>> 'my name is chinku'.split()        #將字符串拆分為列表
['my', 'name', 'is', 'chinku']

>>> "my,name,is,chinku".split(',')
['my', 'name', 'is', 'chinku']




>>> help(round)
Help on built-in function round in module builtins:

round(number, ndigits=None)
    Round a number to a given precision in decimal digits.
    
    The return value is an integer if ndigits is omitted or None.  Otherwise
    the return value has the same type as the number.  ndigits may be negative.








>>> for i in range(0,5):
print(i)
0
1
2
3
4

>>> a='12345'
>>> print(a[1:3])
23
>>> b=a[0:2]+'A'+a[3:5]
>>> b
'12A45'









----------------------- 常用數值函數

>>> abs(-5)
5

>>> bool(0)          #非 0 即真
False
>>> bool(-3)
True

>>> divmod(8,4)      #除,傳回 商 與 餘數
(2, 0)

>>> float(6)
6.0

>>> import math
>>> math.floor(3.14159)        #傳回小於原數的整數 (去除小數點)
3

>>> hex(10)
'0xa'
>>> hex(16)
'0x10'

>>> oct(7)
'0o7'
>>> oct(8)
'0o10'


>>> int(4.7)
4
>>> max(45,23,76)
76
>>> min(45,23,76)
23

>>> pow(2,3)        # 2 的 3 次方
8



>>> round(8.4)
8
>>> round(8.5)
8
>>> round(8.6)
9
>>> round(8.9)        #傳回最接近原數的整數
9


>>> sorted([2,8,5,3,1])        #list 小到大排序
[1, 2, 3, 5, 8]

>>> sorted([2,8,5,3,1],reverse=True)         #list 大到小排序
[8, 5, 3, 2, 1]


>>> sum([2,8,5,3,1])
19

>>> type(3.5)
<class 'float'>











沒有留言:

張貼留言