內容選單標籤

2021年7月14日 星期三

python 綜合練習



月曆
***********************************************20120714*
------------------------------------------------------ 沒有使用Module

import math as MT

def printMyCalendar(mhTolDays,mhStartWeekDay):
        print('-----'*7)
        print('  Sun  Mon  Tue  Wed  Thu  Fri  Str')

        '''每一個印出資料佔5個空格'''
        print('     '*mhStartWeekDay,end='')

        for i in range(1,mhTolDays+1):
            print('{0:5d}'.format(i),end='')
            if((i+mhStartWeekDay)%7==0):
                print()
        '''
        只要知道:
        1.查詢的該年月的總天數
        2.查詢的該年月的1日周幾                
        '''
        
strYr=input("please input year:")
intYr=int(strYr)
intMh=int(input("please input month:"))


#查詢年的月份有多少天
if (intMh==2):
    if(intYr%400==0 or (intYr%4==0 and intYr%100!=0)):
        maxDay=29
    else:
        maxDay=28
else:
    if(intMh==4 or intMh==6 or intMh==9 or intMh==11):
        maxDay=30
    else:
        maxDay=31





'''
蔡勒公式(Zeller's congruence),是一種計算任何一日屬一星期中哪一日的演算法
w:星期(計算所得的數值對應的星期:0-星期日;1-星期一;2-星期二;3-星期三;4-星期四;5-星期五;6-星期六)[註 1]
c:年份前兩位數
y:年份後兩位數
m:月(m的取值範圍為3至14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計算,比如2003年1月1日要看作2002年的13月1日來計算)
d:日
'''
c=int(strYr[0:2])
y=int(strYr[2:4])
m=intMh
d=1

if(m==1):
    y=y-1
    m=13

if(m==2):
    y=y-1
    m=14

'''    
Zeller's congruence
[ ]:稱作高斯符號,代表向下取整,即,取不大於原數的最大整數
python 使用 math.ceil()
'''
w=y+(MT.ceil(y/4)+MT.ceil(c/4)-2*c+(26*MT.ceil((m+1)/10))+d-1)    


#w可能為負數,所以當出現負數的情況下不能直接mod 7
if (w<0):
    w=(w%7+7)%7
else:
    w=w%7

printMyCalendar(maxDay,w)



------------------------------------------------------使用 datetime Module
import datetime as DT

def printMyCalendar(mhTolDays,mhStartWeekDay):
        print('-----'*7)
        print('  Sun  Mon  Tue  Wed  Thu  Fri  Str')

        '''每一個印出資料佔5個空格'''
        print('     '*mhStartWeekDay,end='')

        for i in range(1,mhTolDays+1):
            print('{0:5d}'.format(i),end='')
            if((i+mhStartWeekDay)%7==0):
                print()
        '''
        只要知道:
        1.查詢的該年月的總天數
        2.查詢的該年月的1日周幾                
        '''
        

LstMD=[31,28,31,30,31,30,31,31,30,31,30,31]

yr=int(input("please input year:"))
mh=int(input("please input month:"))

#輸入年月的1日化成日期格式
YrMhStart=DT.date(yr,mh,1)

#閏年2月29天
if(yr%400==0 or (yr%4==0 and yr%100!=0)):
    LstMD[1]=29

#輸入年月的總天數
mhTolDays=LstMD[mh-1]
#print(mhTolDays)

#輸入年月的1日是周幾 0:星期日 1:星期一
mhStartWeekDay=DT.date.isoweekday(YrMhStart)
#print(mhStartWeekDay)

printMyCalendar(mhTolDays,mhStartWeekDay)





------------------------------------------------------使用 calendar Module
import calendar as CD

yr=int(input("please input year:"))
mh=int(input("please input month:"))

"""傳回 tuple1 內含該年月份第1天是星期幾及該月有幾天
   如:2021/7 -->(3,31) 此以
   周一 = 0 但我們以
   週日 = 0
   所以TplWeekDays[0]+1
"""   
TplWeekDays=CD.monthrange(yr,mh)

print('  Sun  Mon  Tue  Wed  Thu  Fri  Str')

'''每一個印出資料佔5個空格'''
print('     '*(TplWeekDays[0]+1),end='')
for i in range(1,TplWeekDays[1]+1):
    print('{0:5d}'.format(i),end='')
    if((i+TplWeekDays[0]+1)%7==0):
        print()





------------------------------------------------------使用 calendar Module
import calendar as CD

yr=int(input("please input year:"))
mh=int(input("please input month:"))

'''
預設值
 0   1   2   3   4   5   6
一  二  三  四  五  六  日

6:周日

希望改成

 0   1   2   3   4   5   6
日  一  二  三  四  五  六  
'''
CD.setfirstweekday(6)

print(CD.month(yr,mh))





Function    Module    Package
**********************************************20120714*
------------------------------------------------------Function
>>> def myAdd(a,b):
return a+b

>>> myAdd(7,2)
9




------------------------------------------------------Module / Function 
# save as  \myMath\myAddSub_module.py
def myAdd(a,b):
    return a+b

def mySub(a,b):
    return a-b


# save as  \myMath\04.py
import myAddSub_module as AS
print(AS.myAdd(7,2))
print(AS.mySub(7,2))

== RESTART: F:\python\myMath\04.py 
9
5

#產生模組已編譯好的檔案
# \myMath\__pycache__\myAddSub_module.cpython-39





------------------------------------------------------Module / Class
#save as \myMath\myMulDiv_class.py
class myMulDiv():
    def __init__(self,a,b):
        self.a=a
        self.b=b
        self.ans=0

    def myMul(self):
        self.ans=self.a*self.b
        return self.ans

    def myDiv(self):
        self.ans=self.a/self.b
        return self.ans


# save as  \myMath\05.py
import myMulDiv_class as MD
obj=MD.myMulDiv(7,2)
print(obj.myMul())
print(obj.myDiv())

==RESTART:F:\python\myMath\05.py====================
14
3.5




#套件,利用資料夾來管理功能相近的模組 *.py
#可以使用 Function 或 Class
#使用時皆以 import 匯入
------------------------------------------------------Package
# \myMath\__pycache__\myAddSub_module.cpython-39
# \myMath\__pycache__\myMulDiv_class.cpython-39
# \myMath\__init__.py     (手動建立的空白檔) 
\myMath\04.py
\myMath\05.py
\myMath\06.py
\myMath\myAddSub_module.py
\myMath\myMulDiv_class.py


# save as  \myMath\06.py
import myAddSub_module as AS
import myMulDiv_class as MD

print(AS.myAdd(7,2))
print(AS.mySub(7,2))

obj=MD.myMulDiv(7,2)
print(obj.myMul())
print(obj.myDiv())


=RESTART:F:\python\myMath\06.py======================
9
5
14
3.5







if 敘述
**********************************************201207*
>>> if(3<5):"成立"

'成立'
>>> "成立" if(3<5) else "不成立"
'成立'







列出ASCII 字元
**********************************************201207*
>>> for i in range(0,255+1):
print("{0:5d}={1:1s}".format(i,chr(i)),end='')
if(i%7==0):
print()

    0=
    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=   32=    33=!   34="   35=#
   36=$   37=%   38=&   39='   40=(   41=)   42=*
   43=+   44=,   45=-   46=.   47=/   48=0   49=1
   50=2   51=3   52=4   53=5   54=6   55=7   56=8
   57=9   58=:   59=;   60=<   61==   62=>   63=?
   64=@   65=A   66=B   67=C   68=D   69=E   70=F
   71=G   72=H   73=I   74=J   75=K   76=L   77=M
   78=N   79=O   80=P   81=Q   82=R   83=S   84=T
   85=U   86=V   87=W   88=X   89=Y   90=Z   91=[
   92=\   93=]   94=^   95=_   96=`   97=a   98=b
   99=c  100=d  101=e  102=f  103=g  104=h  105=i
  106=j  107=k  108=l  109=m  110=n  111=o  112=p
  113=q  114=r  115=s  116=t  117=u  118=v  119=w
  120=x  121=y  122=z  123={  124=|  125=}  126=~
  127=  128=€  129=  130=‚  131=ƒ  132=„  133=…
  134=†  135=‡  136=ˆ  137=‰  138=Š  139=‹  140=Œ
  141=  142=Ž  143=  144=  145=‘  146=’  147=“
  148=”  149=•  150=–  151=—  152=˜  153=™  154=š
  155=›  156=œ  157=  158=ž  159=Ÿ  160=   161=¡
  162=¢  163=£  164=¤  165=¥  166=¦  167=§  168=¨
  169=©  170=ª  171=«  172=¬  173=­  174=®  175=¯
  176=°  177=±  178=²  179=³  180=´  181=µ  182=¶
  183=·  184=¸  185=¹  186=º  187=»  188=¼  189=½
  190=¾  191=¿  192=À  193=Á  194=  195=à 196=Ä
  197=Å  198=Æ  199=Ç  200=È  201=É  202=Ê  203=Ë
  204=Ì  205=Í  206=Π 207=Ï  208=Р 209=Ñ  210=Ò
  211=Ó  212=Ô  213=Õ  214=Ö  215=×  216=Ø  217=Ù
  218=Ú  219=Û  220=Ü  221=Ý  222=Þ  223=ß  224=à
  225=á  226=â  227=ã  228=ä  229=å  230=æ  231=ç
  232=è  233=é  234=ê  235=ë  236=ì  237=í  238=î
  239=ï  240=ð  241=ñ  242=ò  243=ó  244=ô  245=õ
  246=ö  247=÷  248=ø  249=ù  250=ú  251=û  252=ü
  253=ý  254=þ  255=ÿ


ASCII 整數編號( 0 ~ 127 ),其中分成 
(1)半形字(可顯示):編號32~126 一個整數編號 會對應到 一個半形字
(2)控制字元(不可顯示):編號0~31、127 一個整數編號 會對應到 一個控制字元


>>> ord('A')
65
>>> chr(65)
'A'
>>> '\101'    //8進制數字
'A'
>>> '\x41'    //16進制數字
'A'

目前尚未找到    2進制數字 以跳脫字元輸出 字元







python 有效數字很大所以適合大數據 
**********************************************201207*
>>> j=1
>>> for i in range(1,25):
j*=i
print(j)

1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
6227020800
87178291200
1307674368000
20922789888000
355687428096000
6402373705728000
121645100408832000
2432902008176640000
51090942171709440000
1124000727777607680000
25852016738884976640000
620448401733239439360000





print() 格式
**********************************************201207*
>>> print('{0:4s}'.format("ABCD"))
ABCD
>>> print('{0:4s}'.format("ABC"))
ABC 
>>> print('{0:4s}'.format("AB"))
AB  
>>> print('{0:4s}'.format("A"))
A   
//文字靠左對齊



>>> print('{0:6.2f}'.format(123.45))
123.45
>>> print('{0:6.2f}'.format(23.4))
  23.40
>>> print('{0:6.2f}'.format(3))
    3.00

//以小數點位置對齊
//小數位數要佔2位
//小數點也要佔1位
//整數部分不足補空格
//小數部份不足補0







字元畫圖
----------------------------------------------------------------
>>> for i in range(1,9+1):
for j in range(1,i+1):
print(j,end='')
print()

1
12
123
1234
12345
123456
1234567
12345678
123456789



>>> for i in range(9,0,-1):
for j in range(i,0,-1):
print(j,end='')
print()

987654321
87654321
7654321
654321
54321
4321
321
21
1



>>> for i in range(1,9+1):
print((9-i)*' ',end='')
for j in range(1,i+1):
print(j,end='')
print()

                1
              12
            123
          1234
        12345
      123456
    1234567
  12345678
123456789



>>> for i in range(1,9+1):
print((9-i)*' ',end='')
for j in range(1,i+1):
print(j,end='')
for k in range(i-1,0,-1):
print(k,end='')
print()

                1
              121
            12321
          1234321
        123454321
      12345654321
    1234567654321
  123456787654321
12345678987654321





計算迴圈執行次數
----------------------------------------------------------------

>>> cnt=0
>>> for i in range(5+1):    //0~5
for j in range(5+1):    //0~5
cnt+=1
 
>>> cnt
36
//6*6

>>> cnt=0
>>> for i in range(5+1):    //0~5
for j in range(i,0-1,-1):    //i~0
cnt+=1

>>> cnt
21
//((6+1)/2)*6



>>> for i in range(5+1):    //0~5
for j in range(i+1):    //0~i
cnt+=1

>>> cnt
21
//((6+1)/2)*6






5!=5*4*3*2*1                factorial
----------------------------------------------------------------
>>> for i in range(5,1-1,-1):
res*=i

>>> res
120


++++++++++++++Recursion
>>> def fact(x):
res=1
if(x==1):
res=1
else:
res=x*fact(x-1)
return res

>>> fact(5)
120




求GCD
----------------------------------------------------------------

x=int(input("x="))
y=int(input("y="))
print("GCD(",x,",",y,")=",end="")
while x%y !=0:
    x,y=y,x%y
else:
    print(y)
=========
x=48
y=60
GCD( 48 , 60 )=12





>>> def GCD(x,y):
if(x<y):x,y=y,x
while(x%y!=0):
mod=x%y
x,y=y,mod
else:
return y

>>> GCD(15,18)
3


++++++++++++++Recursion
>>> def GCD(x,y):
if(x<y):x,y=y,x
mod=x%y
if(mod==0):
return y
else:
return GCD(y,mod)

>>> GCD(15,18)
3






Fabonscci    費氏數列 Fibonacci (費波那契數列)
----------------------------------------------------------------
>>> def Fibonacci(n):
n1=0;n2=1
for i in range(0,n+1):
if(i==0):
nn=0
elif(i==1):
nn=1
else:
nn=n1+n2
n1=n2
n2=nn
print(nn,end=' ')

>>> Fibonacci(10)
0 1 1 2 3 5 8 13 21 34 55



++++++++++++++Recursion
>>> def Fabonassi(n):
if(n==0 or n==1):
return n
else:
return Fibonacci(n-1)+Fibonacci(n-2)

>>> Fibonacci(10)
   0   1   1   2   3   5   8  13  21  34  55





進制轉換
----------------------------------------------------------------

+++++++++++++++++++++++10轉10
>>> def DectoDec(x):
Lst=[]
while (True):
Lst.append(x%10)
x=x//10
if(x==0):
Lst.reverse()
for i in range(len(Lst)):
print(Lst[i],end='')
break

>>> DectoDec(534)
534

//一直用商數除以10,直到商數為0
//每次除取餘數,得到[4,3,5]
//[4,3,5]反轉後[5,3,4]在輸出


+++++++++++++++++++++++10轉2
>>> def DectoBin(x):
Lst=[]
while (True):
Lst.append(x%2)
x=x//2
if(x==0):
Lst.reverse()
for i in range(len(Lst)):
print(Lst[i],end='')
break

>>> DectoBin(534)
1000010110



+++++++++++++++++++++++10轉8
>>> def DectoOct(x):
Lst=[]
while (True):
Lst.append(x%8)
x=x//8
if(x==0):
Lst.reverse()
for i in range(len(Lst)):
print(Lst[i],end='')
break

>>> DectoOct(534)
1026



+++++++++++++++++++++++10轉16
>>> def DectoHex(x):
Lst=[]
while (True):
Lst.append(x%16)
x=x//16
if(x==0):
Lst.reverse()
for i in range(len(Lst)):
print(Lst[i],end='')
break

>>> DectoHex(534)
216






+++++++++++++++++++++++10轉10
>>> def DectoDec(x):
str1=str(x)
strLen=len(str1)
IntN=0
for i in range(strLen):
IntN+=int(str1[i])*10**(strLen-1-i)
return IntN

>>> DectoDec(534)
534

//5*10^2+3*10^1+4*10^0

+++++++++++++++++++++++2轉10
>>> def BintoDec(x):
str1=str(x)
strLen=len(str1)
IntN=0
for i in range(strLen):
IntN+=int(str1[i])*2**(strLen-1-i)
return IntN

>>> BintoDec(1000010110)
534


+++++++++++++++++++++++8轉10
>>> def OcttoDec(x):
str1=str(x)
strLen=len(str1)
IntN=0
for i in range(strLen):
IntN+=int(str1[i])*8**(strLen-1-i)
return IntN

>>> OcttoDec(1026)
534



+++++++++++++++++++++++16轉10
>>> def HextoDec(x):
str1=str(x)
strLen=len(str1)
IntN=0
for i in range(strLen):
IntN+=int(str1[i])*16**(strLen-1-i)
return IntN

>>> HextoDec(216)
534







+++++++++++++++++++++++小數點後10轉2
>>> def PointDecToBin(x):
    flt=x;Lst=[];str1=""
    while(flt!=0):
        str1=str(flt*2)
        Lst.append(str1[:str1.index('.')])
        flt=float(str1[str1.index('.'):])
        if(len(Lst)>=9):
            Lst.append("...")
            break

    print("0.",end='')
    for i in Lst:
        print(i,end='')

>>> PointDecToBin(0.625)
0.101

>>> PointDecToBin(0.8125)
0.1101

>>> PointDecToBin(0.875)
0.111

>>> PointDecToBin(0.3)
0.010011001...

>>> PointDecToBin(0.7)
0.101100110...






Python Pattern Program - Printing Stars in Heart Shape
----------------------------------------------------------------
for row in range(6):
    for col in range(7):
        if (row==0 and col%3!=0) or (row==1 and col%3==0) or (row-col==2) or (row+col==8):
            print("*",end="")
        else:
            print(end=" ")

    print()
=========











----------------------------------------------------------------


----------------------------------------------------------------


----------------------------------------------------------------


----------------------------------------------------------------


----------------------------------------------------------------



沒有留言:

張貼留言