Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Methoden und Beispiele für den Umgang mit zu langen Slice-Parametern in Python

Einführung in die Methoden und Beispiele für den Umgang mit zu langen Slice-Parametern in Python

coldplay.xixi
coldplay.xixinach vorne
2020-12-15 17:05:203284Durchsuche

Python-TutorialDie Kolumne stellt vor, wie man mit zu langen Slice-Parametern umgeht

Einführung in die Methoden und Beispiele für den Umgang mit zu langen Slice-Parametern in Python

Viele Freunde haben nur ein konzeptionelles Verständnis von Slice-Parametern, nämlich Schritt, Start und Stopp. Da auch die Werte der Parameter variabel sind, müssen wir sie im nächsten Schritt verarbeiten. In der vorherigen Slice-Erklärung haben wir das Problem zu langer Listendaten erwähnt, und dieses Problem besteht auch bei Parametern. Als Nächstes erläutern wir die jeweilige Verarbeitung der drei Parameter Schritt, Start und Stopp, um Ihnen ein umfassendes Verständnis der Parameterprobleme im Slice zu vermitteln.

Verwandte kostenlose Lernempfehlungen: Python-Tutorial (Video)

1.Schrittverarbeitung

if (r->step == Py_None) {
     /* step 默认是 1,这不难理解 */
   *step = 1;
 } else {
   if (!_PyEval_SliceIndex(r->step, step)) return -1;
     /* step 不能为零,否则报 ValueError,要注意的是,这个异常是在执行 BINARY_SUBSCR 才报出来,
    * 在创建 slice 对象时如果 step 为 0 并不会报错 */
   if (*step == 0) {
     PyErr_SetString(PyExc_ValueError, "slice step cannot be zero");
     return -1;
   }
   /* step 的最小值,他是根据 size_t 来定义的
    * #define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
    * 所以在 32 为系统上就是 -2147483647 */
   if (*step < -PY_SSIZE_T_MAX)
     *step = -PY_SSIZE_T_MAX;
 }

2.Verarbeitung starten

/* 当 start 未设置时的默认值,length 是序列的长度
  * 如果切片从序列头部开始(step > 0),start = 0
  * 如果切片从序列末尾开始(step < 0),start = length - 1 */
 defstart = *step < 0 ? length-1 : 0;
 if (r->start == Py_None) {
   *start = defstart;
 }
 else {
   if (!_PyEval_SliceIndex(r->start, start)) return -1;
   /* 如果 start 是负数,其实是通过加上序列长度转化成正数的 a[-1:] <=> a[4:] */
   if (*start < 0) *start += length;
   /* 如果加上 length 还是小于 0,也就是 -start 超出了序列长度,这时候会根据 step 的正负将start
    * 设置为序列的开始(0)或结束(-1)位置
    * a[-6:-1]  <=> a[0:-1]
    * a[-6:-1:-1] <=> a[-1:-1:-1] */
   if (*start < 0) *start = (*step < 0) ? -1 : 0;
    /* start 超出了序列长度,这时候会根据 step 的正负将start
    * 设置为序列的长度或序列长度减 1(最后一个元素)
    * a[6:-1]  <=> a[5:-1]
    * a[6:-1:-1] <=> a[4:-1:-1] */
   if (*start >= length)
     *start = (*step < 0) ? length - 1 : length;
 }

3.Verarbeitung stoppen

/* 当 stop 未设置时的默认值,length 是序列的长度
  * 如果切片从序列头部开始(step > 0),stop = length,比最后一个元素的下标多 1
  * 如果切片从序列末尾开始(step < 0),start = -1,比第一个元素的下标少 1 */
 defstop = *step < 0 ? -1 : length;
 if (r->stop == Py_None) {
   *stop = defstop;
 } else {
   if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
   /* 如果 stop 是负数,其实是通过加上序列长度转化成正数的 a[:-1] <=> a[:4] */
   if (*stop < 0) *stop += length;
   /* 如果加上 length 还是小于 0,也就是 -stop 超出了序列长度,这时候会根据 step 的正负将 stop
    * 设置为序列的开始(0)或结束(-1)位置
    * a[3:-6]  <=> a[3:0]
    * a[3:-6:-1] <=> a[3::-1] */
   if (*stop < 0) *stop = (*step < 0) ? -1 : 0;
   if (*stop >= length)
     *stop = (*step < 0) ? length - 1 : length;
 }

Hinweis:

  • Angegebenes Intervall Es ist offen gelassen und rechts geschlossener Typ
  • Von vorne beginnen, die Startindexnummer kann weggelassen werden, der Doppelpunkt kann nicht weggelassen werden
  • Es endet am Ende, die Endindexnummer kann weggelassen werden, aber der Doppelpunkt kann nicht weggelassen werden.
  • Die Schrittgröße ist standardmäßig 1. Wenn Sie kontinuierlich schneiden, können sowohl Zahlen als auch Doppelpunkte weggelassen werden.

Über die Erweiterung der Slice-Operation in Python:

Die vollständige Syntax der Slice-Operation in Python:

# i默认是0
# j默认是len(S)
# k的步长,默认为+1
S[i:j:k]

wobei i, j, k alle negative Zahlen sein können:

Wenn i < 0 oder k < , es entspricht len(S) + i, oder len(S) + j;

Wenn k < k Zählt nach rechts

>>>S = &#39;abcdefg&#39;
>>>S[-3:-1]
&#39;ef&#39;

>>>S[-1:-3:-1]  # 将位于S[-1:-3]的字符子串,按照步长1,从右往左数,而不是从左往右数
&#39;gf&#39;

>>>S[4:2:-1]
&#39;ed&#39;

>>>S[2:4:-1]  # 输出空字符串
&#39;&#39;

>>>S[::-1]  # 逆序
&#39;gfedcba&#39;

Es sollte darauf hingewiesen werden, dass die Form von s[i:j:k] der folgenden Form entspricht:

>>>S = &#39;abcdefg&#39;
>>>S[slice(None, None, -1)]  # 等价于使用slice对象进行数组元素的访问操作
&#39;gfedcba&#39;

Damit ist dieser Artikel über die Verarbeitungsmethoden und Beispiele für übermäßig lange Slice-Parameter abgeschlossen in Python Das war’s für die Einführung.

Das obige ist der detaillierte Inhalt vonEinführung in die Methoden und Beispiele für den Umgang mit zu langen Slice-Parametern in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen