Maison  >  Article  >  développement back-end  >  Présentation des méthodes et des exemples de gestion des paramètres de tranche trop longs en python

Présentation des méthodes et des exemples de gestion des paramètres de tranche trop longs en python

coldplay.xixi
coldplay.xixiavant
2020-12-15 17:05:203285parcourir

Tutoriel PythonLa colonne présente comment gérer les paramètres de tranche trop longs

Présentation des méthodes et des exemples de gestion des paramètres de tranche trop longs en python

La compréhension conceptuelle de nombreux amis des paramètres de tranche reste conceptuelle, le découpage Il y a trois paramètres, à savoir step, start et stop. Étant donné que les valeurs des paramètres sont également variables, nous devons les traiter à l'étape suivante. Dans l'explication précédente de slice, nous avons évoqué le problème des données de liste trop longues, et ce problème existe également dans les paramètres. Ensuite, nous expliquerons le traitement respectif des trois paramètres step, start et stop pour vous aider à avoir une compréhension approfondie des problèmes de paramètres dans slice.

Recommandations d'apprentissage gratuites associées : Tutoriel Python(vidéo)

Traitement 1.étape

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.démarrer le traitement

/* 当 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.arrêter le traitement

/* 当 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;
 }

Remarque :

  • L'intervalle spécifié est de type ouvert à gauche et fermé à droite
  • Commencer depuis le début, commencer Le numéro d'index peut être omis, mais les deux points ne peuvent pas être omis.
  • se termine à la fin.
  • La taille du pas est par défaut de 1. Si vous découpez en continu, les nombres et les deux-points peuvent être omis.

À propos de l'extension de l'opération slice en Python :

La syntaxe complète de l'opération slice en Python :

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

où i, j, k peuvent tous être négatifs nombres :

Si i < 0 ou k < 0, cela équivaut à len(S) + i, ou len(S) + j

Si k < cela signifie [i , k), les caractères entre sont comptés de droite à gauche selon la taille du pas k, plutôt que de gauche à droite

>>>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;

Il faut préciser que la forme de s[i : j:k] est équivalent à La forme suivante :

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

Ceci conclut cet article sur les méthodes de traitement et des exemples de paramètres de slice trop longs en Python.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer