まず、トラップのデフォルトパラメータ
- デフォルトのパラメータのデータ型で唯一の変数のためのトラップ
def func(name, list1=[]):
list1.append(name)
return list1
ret1 = func('jason')
print(ret1, id(ret1)) # ['jason'] 2246045611720
ret2 = func('carly')
print(ret2, id(ret2)) # ['jason', 'carly'] 2246045611720
この結果から、場合は、デフォルトのパラメータは、関係なく、何回、このデフォルトの関数呼び出しの、同じメモリアドレスのデフォルトパラメータ変更可能なデータ型です。
演習1
def func(a, list1=[]):
list1.append(a)
return list1
print(func(10)) # [10]
print(func(20, [])) # [20] # 没有调用默认参数
print(func(30)) # [10, 100] # 再一次调用默认参数,而之前调用默认参数之后,list1 = [10]
演習2
def func(a, list1=[]):
list1.append(a)
return list1
ret1 = func(10)
ret2 = func(20, [])
ret3 = func(30)
print(ret1) # [10, 30]
print(ret2) # [20]
print(ret3) # [10, 30]
print(id(ret1) == id(ret3)) # True # ret1 和ret3 共用一个内存地址
第二に、ローカルスコープピット
あなたは、変数を定義しますが、この変数はそれらを基準に定義されている場合、この関数の前に、Pythonインタプリタは、これが問題の文法だと思います
例えば:
count = 1
def func():
print(count)
count = 2
func()
# 程序报错
# UnboundLocalError: local variable 'count' referenced before assignment
三、グローバル
1.ローカルでグローバル変数を宣言することができます
def func():
global name
name = 'jason'
func()
print(name)
print(globals())
図2は、ローカルでグローバル変数を変更することができます
count = 1
def func():
global count
count += 1
func()
print(count)
四、非ローカル
1.グローバル変数の操作をすることはできません
count = 1
def func():
nonlocal count
func()
2.ローカルスコープ:内部機能変更機能の外層のローカル変数
def func1():
count = 1
def func2():
nonlocal count
count += 1
func2()
print(count)
func1()
V.アプリケーション関数名
1.関数+の名前()この関数を実行することができます
def func():
print(123)
func()
print(func, type(func))
2.関数名は変数です
def func():
print(123)
f = func
f() # 123
def func1():
print('this is func1')
def func2():
print('this is func2')
func2 = func1
func2() # this is func1
3名は、コンテナクラスのデータ要素型として使用することができます
def func1():
print('this is func1')
def func2():
print('this is func2')
def func3():
print('this is func3')
li = [func1, func2, func3]
for i in li:
i()
4.名前をパラメータとして指定することができます
def func1(a):
a()
print('this is func1', end='')
def func2():
print('this is func2', end='\n')
func1(func2) # this is func2 this is func1
名前は、関数の戻り値として使用することができます
def func1():
print('this is func1')
def func2(a):
print('this is func2')
return a
ret = func2(func1)
ret()
第六に、フォーマットされた出力
これまで学んだフォーマットされた入力%sのギ
name = 'jason'
age = 24
msg1 = '我叫%s, 今年%s' % (name, age)
mgs2 = '我叫{}, 今年{}'.
新機能
name= 'jason'
age = 24
msg = f'我叫{name}, 今年{age}'
あなたは式を追加することができます
dic = {'name': 'jason', 'age': 24}
msg = f"我叫{dic.get('name')}, 今年{dic['age']}"
print(msg)
count = 2
print(f'>>>{count**3}')
name = 'jason'
print(f'我的名字是{name.upper()}')
機能への書き込みを組み合わせます
def _sum(a, b):
return a + b
print(f'结果为{_sum(2, 4)}')
七、イテレータ
- 反復可能なの
オブジェクト:すべてのオブジェクトでのpythonを。
反復可能な:更新の繰り返し。、プロセスサイクルを繰り返します。
内部前記':反復可能オブジェクトの__iter__
オブジェクトのメソッド
s = 'sdfsdf'
print(dir(s))
print('__iter__' in dir(s))
-
イテレータ
ツールを反復更新され
内部は「を含む__iter__
」メソッドを、そして含まれている「__next__
オブジェクトのメソッドのイテレータをwith open('test.txt', 'w', encoding='utf-8') as f1: print('__iter__' in dir(f1) and '__next__' in dir(f1)) # True
-
反復可能オブジェクトは、イテレータに変換することができます
s = 'abc'
obj = iter(s) # 或者s.__iter__()
print(obj)
print(next(obj)) # a # 或者s1.__next__()
print(next(obj)) # b
print(next(obj)) # c
-
イテレータの長所と短所
メモリの保存1
2.慣性メカニズム、次回は、単に値をとります
3.スロー
4.イテレータは、常にこの場所の値を覚えています
-
反復同等のオブジェクトとイテレータ
-
より直感的であるイテレート可能オブジェクトを操作する方法であって、比較的少ないデータは、データセットの(オブジェクトの数百万)が格納されます。
-
データの焦点と柔軟性処理、十分なメモリ空間は、データセットは、反復の対象とすることができる場合
-
反復子は、非常にメモリ保存、位置の値を記録することができ、値はループ+次の方法を介して直接であってもよいが、比較データの単一のセットを操作しない直感的な方法
-
データが大きすぎる場合には、メモリの量は、その多くのデータを処理するのに十分である、または第一の要因として、メモリを節約するために、データは、イテレータに設定する必要があります
-
-
whileループのメカニズムのためのループシミュレーション
li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
obj = iter(li)
while 1:
try:
print(next(obj))
except StopIteration:
break