Lista e Matrizes, diferenças entre PHP e Python

Quando eu comecei a programar, comecei com PHP e depois fui pra Python o que me surgiu algumas dúvidas em relação as duas.

O meu problema foi em relação as listas e matrizes com índices numéricos e escritos. Quando eu comentei com o meu namorado Renato Elias ele me disse o seguinte:
“é que em php
é putaria
array é tudo”

Em seguida ele disse:
“eu preciso de um dicionario
use array
eu preciso de um array
use array
eu preciso de um array com dicionario
use array”

Vamos ver como funciona nas duas linguagens:
Lista com índice numérico
PHP

$lista = array(1, 2, 3, 4, 5);

ou

$lista = array(
    0 => 1,
    1 => 2,
    2 => 3,
    3 => 4,
    4 => 5
);

Python

lista=[1, 2, 3, 4, 5]

Matriz com índice numérico
PHP

$matriz = array(array(1,2,3),array(4,5,6),array(7,8,9));

ou

$matriz = array(
    0 => array(1,2,3),
    1 => array(4,5,6),
    2 => array(7,8,9)
);

Python

lista=[[1,2,3],[4,5,6],[7,8,9]]

Lista com índice não numérico
PHP

$lista = array('fruta' => 'maçã', 'legume' => 'cenoura');

ou

$lista = array(
    'fruta' => 'maçã',
    'legume' => 'cenoura'
);

Python

lista={'fruta':'maçã','legume':'cenoura'}

<strong>Matriz com índice não numérico</strong>
PHP

$matriz = array (
    "frutas"  => array (
        "a" => "laranja",
        "b" => "banana",
        "c" => "maçã",
    ),
    "numeros" => array (
        1,
        2,
        3,
        4,
        5,
        6
    ),
    "buracos" => array (
        "primeiro",
        5 => "segundo",
        "terceiro",
    ),
);

Python

matriz={"frutas":{"a":"laranja","b":"banana","c":"maçã"},'numeros':[1,2,3,4,5,6],"buracos":{0:"primeiro",5:"segundo",6:"terceiro"}}

Notaram o "barraco"???

Vou colocar em uma tabela para notarem:

PHP Python
Lista com índice numérico Array Array
Matriz com índice numérico Array Array
Lista com índice não numérico Array Dicionário
Matriz com índice não numérico Array Dicionário

Paginação

Quando não há a possibilidade de usar um plugin para realizar a paginação o jeito é fazer na unha. Para isso, é necessário muita lógica e paciência no desenvolvimento.

Vou utilizar um exemplo com 11 páginas.

Basicamente a paginação vai apresentar 5 formas diferente:
1 – 1ª página + 4 páginas seguintes:

2 – 5 primeiras páginas:


3 – 2 páginas anteriores + atual + 2 página posteriores


4 – 5 últimas páginas:


5 – 4 páginas anteriores + a última página:

Vamos ao código!
Para começarmos, precisamos de algumas variáveis que vão nos auxiliar nesse trabalho:

    #Retorna a página que está. Será passada desta forma na URL: /page/2
    pag=int(request.args[2])

    #Quantidade de post's que a página deve ter
    qtd=2

    #Números de post's que é retornado (total)
    tam=len(cds)

Para determinar a última página devemos dividir o total de post’s com a quantidade de cada página. Se tiver resto o valor deve ser acrecido em 1.

    if tam%qtd==1:
        ultima=tam/qtd+1
    else:
        ultima=tam/qtd

Para montar a paginação, precisamos determinar os valores minimo e máximo do for. Este for vai mostrar os post’s de acordo com a página.
Forma 1 e 2: os valores devem estar entre 1 e 5 (em python, sem coloque mais um para funcionar no range)

    if pag>= 1 and pag<=4:
        min=1
        max=6

Forma 5: os valores devem ser superiores a página final

    if (pag+4)>ultima:            
        min=ultima-4
        max=ultima+1

Veja como fica o código final:

    #Forma 1 e 2
    if pag>= 1 and pag<=4:
        min=1
        if ultima<6:
            max=ultima+1
        else:
            max=6
    else:   
        #Forma 4 e 5
        if (pag+4)>ultima:            
            min=ultima-4
            max=ultima+1
        #Forma 3
        else:                    
            min=pag-2
            max=pag+3

OK, já localizamos os valores, vamos ao lado prático:

<!--Verifica se a página pode ou não ter paginação-->
{{if pag['tam'] > pag['qtd']:}}
<div class="center">
    <div class="pagination">
        <ul>
            <!--Se não for a página 1, imprime os botões de "Primeira Página" e "Página anterior"-->
            {{if(pag['pag'])>1:}}
            <!-- Botão "Primeira Página" -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],1])}}">&lt;&lt;</a></li>
            <!-- Botão "Página Anterior -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],(pag['pag']-1)])}}">&lt;</a></li>
            {{pass}}

            <!-- Vai imprimir os post's de acordo com os valores mínimo e máximo esbelecidos anteriormente -->
            {{for n in range(pag['min'],pag['max']):}}
                {{if int(pag['pag'])==n:}}
                    <li class="active"><a href="{{=URL(c='default',args=[request.args[0],request.args[1],n])}}">{{=n}}</a></li>       
                {{else:}}
                    <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],n])}}">{{=n}}</a></li>
                {{pass}}
            {{pass}}

            <!-- Se a página que está não for a última, imprime os botões de navegação -->
            {{if pag['pag']<pag['ultima']:}}
            <!-- Botão "Próxima Página" -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],(pag['pag']+1)])}}">&gt;</a></li>
            <!-- Botão "Página Anterior" -->
            <li><a href="{{=URL(c='default',args=[request.args[0],request.args[1],pag['ultima']])}}">&gt;&gt;</a></li>
            {{pass}}     
        </ul>
    </div>
</div>
{{pass}}