51

Python 3 では、次のことができます ( Extended Iterable Unpackingに関する PEP3132 も参照してください)。

a, *b = (1, 2, 3)
# a = 1; b = (2, 3)

Python 2.xで同じようにエレガントにするにはどうすればよいですか?


単一要素アクセスとスライス操作を使用できることはわかっていますが、もっとPythonicな方法があるのではないかと思います。これまでの私のコード:

a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)

いいえ、メッセージが受信されても​​アプリは起動しません。iOS によって処理されます。

ユーザーが通知の表示を選択すると、アプリが起動します。したがって、ユーザーが通知に反応しない場合、アプリは起動されません。ユーザーがアプリのプッシュ通知を選択したときに iOS がアプリを起動する場合は、lauchOptions 辞書をチェックして、プッシュ通知があるかどうかを確認する必要があります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    _rootViewController = [[RootViewController alloc] init];

    self.window.rootViewController = self.rootViewController;   

        NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    if (remoteNotif) {
        //Handle notification
    } 
}

アプリが既に実行されていてフォアグラウンドで実行されている場合、アプリのデリゲートは通知を直接受け取ります。このメソッド- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfoは、アプリ デリゲートで呼び出されます。

4

5 に答える 5

33

関連するPEP3132にも Python 2.x の例がいくつかあることがわかりました。

多くのアルゴリズムでは、シーケンスを「最初、残り」のペアに分割する必要があります。

first, rest = seq[0], seq[1:]

[...]

また、右側の値がリストではなく iterable の場合、スライスを行う前にリストに変換する必要があります。この一時的なリストを作成しないようにするには、次の方法に頼る必要があります。

it = iter(seq)
first = it.next()
rest = list(it)

この質問への回答で与えられた他のアプローチ:

関数の引数リストのアンパッキング手法

追加の関数定義/呼び出しが必要です:

def unpack(first, *rest): 
  return first, rest
first, rest = unpack( *seq )

関数の引数リストのアンパックでは実装されているのに、通常のタプルのアンパックでは実装されていないのはなぜだろうか。

ジェネレーターアプローチ

クレジット。カスタム関数の実装も必要です。最初の変数の数に関して、もう少し柔軟です。

def unpack_nfirst(seq, nfirst):
  it = iter(seq)
  for x in xrange(nfirst):
    yield next(it, None)
  yield tuple(it)
first, rest = unpack_nfirst(seq, 1)

最もpythonicなのは、おそらく上記のPEPで言及されているものでしょう。

于 2012-04-24T14:48:16.913 に答える
19

間違っているかもしれませんが私の知る限り

a, *b = (1, 2, 3)

タプルのスライスとインデックス付けのための単なる構文糖衣です。便利だと思いますが、あまり明確ではありません。

于 2012-04-24T14:17:38.927 に答える
8

私はこの便利な小さな機能を持っています:

def just(n, seq):
    it = iter(seq)
    for _ in range(n - 1):
        yield next(it, None)
    yield tuple(it)

例えば:

a, b, c = just(3, range(5))
print a, b, c
## 0 1 (2, 3, 4)

より少ない引数でも動作します:

a, b, c = just(3, ['X', 'Y'])
print a, b, c
## X Y ()

コメントに応じて、次を定義することもできます。

def take2(a, *rest): return a, rest
def take3(a, b, *rest): return a, b, rest
def take4(a, b, c, *rest): return a, b, rest
... etc

次のように使用します。

p = (1,2,3)
a, b = take2(*p)
print a, b
## 1 (2, 3)
于 2012-04-24T14:31:06.173 に答える
4

あなたが投稿した方法よりも良い方法はないと思いますが、ここに別の方法がありますiter

>>> x = (1,2,3)
>>> i = iter(x)
>>> a,b = next(i), tuple(i)
>>> a
1
>>> b
(2, 3)
于 2012-04-24T14:24:18.257 に答える
2

コンテキストについてはよくわかりませんが、.pop(0) はどうですか?

あなたの例にはタプルがあるようですが、あなたがするようなことをしたいのであれば、リストの方が適していると思いますか? (質問に記載されていない不変である正当な理由がない限り。)

b = [1,2,3]
a = b.pop(0)
于 2012-04-24T14:24:18.330 に答える