1.文字列処理
例えば、2倍の値に置き換え数文字列:
変更前: "AS7G123m(D)F77k"
更新: "AS14G246m(D)F154k"
個人の思考:2で操作のためのアウト正の数と一致し、その文字列は、それらの数値に応じて切断された最初の式は、文字、数字のリストを取得し、最終的には2スプライシング後に元の文字によって乗算されます最終的な結果を得ることができます。(私の頭は愚かであるあなたがあなたと共有することを望んで、より良く、より便利な方法を持っている場合、私は、何かを考えることはできません!)
1 インポートのRe 2 。3テキスト= " AS7G123m(D)F77k " 4 NUMSはre.findallを=(R&LT ' (\ + D)'、テキスト) #数字列を削除する 。5 double_nums = [2 * INT(I)のために I で NUMS] #2を乗じ 6。 the_str = [] #の文字リスト 7。 ための I におけるNUMS: 8 the_str.append(text.split(Iは,. 1 )[0]) 9。 テキスト= text.split(I ,. 1)[1。] 10結果= "" #结果 11 のための I における範囲(LEN(double_nums)): 12 結果+ = the_str [I] + STR(double_nums [I]) 13結果+ = テキスト 14 プリント(結果)
2.Pythonパスパラメータ値は、参照渡しまたは通過されますか?
答えは、参照によって渡されたPythonパス引数、それが参照することによって渡されることを証明する必要があるということですか?次の例を参照することができます:
1つの デフF(X): 2 プリント(ID(X)) 3 4 5 A = 1枚の 6 プリント(ID(A)) 7 F(A) 8 #140716760159264 9 #140716760159264
这里分别打印了两个地址,一个是对象a的地址,一个是传入的参数x的地址,可以看到两个地址是一样的,这也就说明Python中的传参使用的引用传递!需要注意的是:对于不可变类型,在函数中对其操作并不会对原对象产生影响,但对于可变类型,在函数中对其操作则可能会改变其值,如下:
1)传入的参数是不可变类型:
1 def f(x): 2 x += "666" # 这里会创建一个新的对象 3 print(x) 4 5 6 s = "777" # 字符串不可变 7 print(s) 8 f(s) 9 print(s) 10 11 # 777 12 # 777666 13 # 777
2)传入的参数是可变类型:
1 DEF F(X): 2 x.append(4) #は、元のオブジェクトの値を変更する 3。 プリント(X) 4。 5。 6。 S = [1,2 ,. 3] #リスト変数 7。 プリント(S) 8。 F(S ) 。9 プリント(S) 10 。11 #[1,2 ,. 3] 12である #1 [1、2 ,. 3 ,. 4] 13である #1 [1、2 ,. 3 ,. 4]
3.それらのものの深い浅いコピーコピー
Pythonでは、シャローコピーとディープコピーがで明確にしてくださいです!浅い対深いコピーのために、それを理解することができます。
1)浅いコピー:オブジェクトを作成するが、変更されたオブジェクト参照が、元のオブジェクトを変更する場合は、元のオブジェクトへの参照を含む項目に含まれています。
2)深いコピーを:オブジェクトを作成し、元のオブジェクトに含まれている再帰的なコピーオブジェクト、この時点ではデータを変更すると、元のオブジェクトに影響を与えません。
在下面的代码中包含了赋值、浅拷贝和深拷贝,在Python中赋值即引用对象,所以对c操作也就是对原对象a进行操作,对于浅拷贝对象b和d,对其中的引用进行操作会改变对a中的对象,而对深拷贝对象e进行操作就与原对象a无关了。
1 import copy 2 3 a = [1, [2], 3] 4 b = a[:] # 使用切片操作,浅拷贝 5 c = a # 赋值操作,即引用 6 d = a.copy() # 浅拷贝 7 e = copy.deepcopy(a) # 深拷贝 8 9 b.append(4) 10 c.append(5) 11 d.append(6) 12 d[1].append(2) 13 e.append(7) 14 e[1].append(3) 15 16 print(a) # [1, [2, 2], 3, 5] 17 print(b) # [1, [2, 2], 3, 4] 18 print(c) # [1, [2, 2], 3, 5] 19 print(d) # [1, [2, 2], 3, 6] 20 print(e) # [1, [2, 3], 3, 7]
4.Python一行式能干嘛?
下面是一些Python一行式的示例,从中可以看出Python是非常简洁和强大的!
1)一行代码输出一百以内的奇数:
print([x for x in range(100) if x % 2])
2)一行代码求水仙花数:
print([x for x in range(100, 1000) if int(str(x)[0])**3 + int(str(x)[1])**3 + int(str(x)[2])**3 == x])
3)一行代码打印九九乘法表:
print("".join(["{} * {} = {}\t".format(x, y, x * y) if x != y else "{} * {} = {}\n".format(x, y, x * y) for x in range(1, 10) for y in range(1, x + 1)]))
192.168.12.1 0b11000000 10101000 00001100 00000001に変換されるように、IPアドレスを変換するためのコード4)行:
印刷( "0B" + " ".join(( "00000000" +ビン(INT(i))を交換してください( "0B"、 ""))[ - 8:]"。" のための私ip.splitで() ))
5)1〜10のコードの要件のライン:
functoolsから減らすインポートします。プリント([範囲(1におけるI iについては、11)] X + Y)低減(ラムダX、Y)
5.次のコードの結果は何ですか?
1 DEF MUL(): 2 リターン [ ラムダ X:X *私用 I における範囲(4 )] 3 4 5 プリント([M(2)のために M で MUL()])
上記のコードの結果は、代わりの出力[6、6、6、6]、[0、2、4、6]!
この問題の理由は、Pythonバインディングの閉鎖を遅延させることです。これは、パラメータの値が閉鎖に見つけることが、内部関数が呼び出されることを意味しています。だから、関数mulのは()関数を見ていきますiの値を返すために呼び出されたときにそれは私が最終的に3に割り当てられている、年を返し、forループの完了後、私は3です。したがって、関数は最終結果を乗算することによって渡された値を返すたびに、結果はである[6、6、6、6]。
この問題を解決するには、次の方法を参照することができます:
1)Pythonのジェネレータを使用して。
1 DEF MUL(): 2 用 I における範囲(4 ): 3 収率 ラムダ X:X * I 4 5 6 プリント([M(2)のために M で MUL()])
2)クロージャの作成を、結合するためのデフォルトの関数を使用して。
1 DEF MUL(): 2 リターン [ ラムダ X、I = I:X *私用 I における範囲(4 )] 3 4 5 プリント([M(2)のために M で MUL()])