非計算機專業專業,自學python,記錄一些有意思的**。
因為老師講進製轉換,突發奇想想寫乙個程式能自主轉換(雖然網上有了,但是自己琢磨過**才有意思)
這個程式的使用範圍是2進製到36進製的換算(因為英文本母就只有26個,如果超過36字母就要挑選其他的字元來幫忙了)
沒錯,看到第一行,我也是很懵逼的,但是仔細一分析,原作者考慮的好細節啊!如果去打遊戲,估計肯定是王者級別的選手。def
check
(num, base, target)
:# 待轉換數字,當前進製,目標進製
# 判斷輸入是否有效,對所有的輸入都進行檢查
iftype
(base)
isnot
intor base <
2or base >
36or
type
(target)
isnot
intor target <
2or target >36:
('非法進製數!'
)return
false
iftype
(num)
isint
ortype
(num)
isfloat
: num =
str(num)
.upper(
)elif
type
(num)
isstr
andlen
(num)!=0
: num = num.upper(
)else
('非數字輸入!'
)return
false
if num.count(
'.')
>1:
('多個小數點!'
)return
false
ifnot num.replace(
'.','')
.isalnum():
# isalnum() 方法檢測字串是否由字母和數字組成。如果 string 至少有乙個字元並且所有字元都是字母或數字則返回 true,否則返回 false
('含有其他字元!'
)return
false
for c in num.replace(
'.','')
:if trans(c)
>= base:
('字元超過進製允許!'
)return
false
while
len(num)
>1:
if num[0]
=='0'
and num[1]
!='.'
: num = num[1:
]else
:break
return num
裡面選用的isalnum() 方法。
它的方法是檢測字串是否由字母和數字組成。如果 string 至少有乙個字元並且所有字元都是字母或數字則返回 true,否則返回 false
將輸入的數字轉換為輸出的字母或者是將輸入的字母轉換為數字,直接上**。str
="this2009"
# 字元中沒有空格
(str
.isalnum())
str=
"this is string example....wow!!!"
(str
.isalnum())
'''輸出結果:
true
false
'''
利用型別來判斷選擇轉換方式def
trans
(num)
:# 輸入數字換為字母或輸入字母轉換為數字
iftype
(num)
==int
:if num <10:
return
str(num)
else
:return
chr(
ord(
'a')
+ num -10)
else
:if num.isdigit():
return
int(num)
else
:return
ord(num)
-ord
('a')+
10
裡面出現了isdigit()方法,作用是檢測字串是否由字母和數字組成檢測字串是否只由數字組成。
返回值:如果字串只包含數字則返回 true 否則返回 false。
進行進製轉換的內容了str
="123456"
# only digit in this string
(str
.isdigit())
str=
"this is string example....wow!!!"
(str
.isdigit())
'''輸出結果:
true
false
'''
這個片段沒什麼好講解的,就是進製轉換的操作變成**。看到這裡我只能佩服原作者是真的優秀,要我來寫估計要抓狂到禿頭了。def
basechange
(num, base, target, precision=17)
:# 待轉換數字,當前進製,目標進製,精度
num = check(num, base, target)
if num is
false
:return
none
point = num.find(
'.')
if point ==-1
: point =
len(num)
radix = num.replace(
'.','')
if target ==10:
int_part = radix[
:point][:
:-1]
frac_part = radix[point:
] s =
0 ss =
0for i in
range
(len
(int_part)):
s += trans(int_part[i]
)* base ** i
for i in
range
(len
(frac_part)):
ss += trans(frac_part[i]
)/ base **
(i +1)
return
str(s)
+str
(ss)[1
:]elif base ==10:
int_part =
int(radix[
:point]
) frac_part =
float
('0.'
+ radix[point:])
s =''while
true
: s += trans(int_part % target)
int_part //= target
if int_part ==0:
break
s = s[::
-1]if frac_part !=0:
s +=
'.' ct =
0while frac_part !=
0and ct < precision:
frac_part *= target
s += trans(
int(frac_part)
) frac_part -=
int(frac_part)
ct +=
1return s
else
:return basechange(basechange(num, base,
10, precision=precision),10
, target, precision=precision)
因為作業題目較多,就設定了乙個迴圈,也就簡單一些。
要求就是能迴圈就行了,所以就是0,1快速進行。dec =
1while dec ==1:
number =
input
("請輸入數字"
) m =
eval
(input
("請輸入原進製"))
n =eval
(input
('請輸入輸出進製'))
(basechange(number, m, n)
) dec =
eval
(input
("是否繼續(0/1)"
))
計算機基礎 進製轉換
0111 0101 2 6 2 5 2 4 2 2 2 0 64 32 16 4 1 1171.把十進位制數字拆分成多個2的整數次方之和,把每個拆分結果單獨轉換成二進位制,最後把所有轉換結果合併。85 64 16 4 1 2 6 2 4 2 2 2 0 0100 0000 0001 0000 000...
計算機進製轉換
一 計算機只認識0和1,二進位制。二 2進製轉換成 8進製 和 16進製制,如下圖 二進位制 八進位制 研究上圖發現,3位最高二進位制可以用來表示一位八進位制。所以,將二進位制分解每3位,不夠前面補0,然後每3位轉換為10進製,順序排列即可。二進位制 十六進製制 4位最高二進位制可以用來表示一位十六...
計算機基礎 進製間的轉換
這個進製轉換一直記不住,學會了過段時間就又忘了,今天趁著有空,再學一下 不是 就是原理 十二進位制是計算機所用的語言,就只有 0 和 1 八進位制是從 0 到 7 進製就是我們平時所用到的數從 0 到 10,十六進製制就和它們三個不一樣了,0 到 9沒變,但之後用a 表示 10,b 表示 11 c ...