リスト[]の使い方: 負のインデックス

Python独学ならTech-Joho TOP > Python用語辞典 >リスト[]の使い方: 負のインデックス

インデックス

リストのインデックスとは、リストの後ろの[]の中に入れる数字です。リストの要素にアクセスするとき、何番目の要素かを指定する数字です。

>>> mylist = [1, 9, 9, 8]
>>> print(mylist[0])
1

上の例でいうと、mylist[0]の0がインデックスです。この例だと、0番、つまり一番最初の要素である1が表示されます。

負のインデックス

このインデックスは負の数値も指定できます。この場合、後ろから数えて何番目か、という指定になります。

注意点は、この場合は1で番号が始まります。つまり、-1が一番後ろです。

>>> mylist = [1, 9, 9, 8]
>>> print(mylist[-2])
9

上の例だと、-1は後ろから1番目なので、8が表示されます。

関数を作ってコードを再利用する | Python独学ならTech-Joho(12)

Python独学ならTech-Joho TOP > Python入門カリキュラム > たくさんのデータで同じ処理を繰り返す

関数とは

関数は、データを変換する道具です。 その使い方についてはこちらの記事で説明しました。 関数とメソッドを使ってみる

Pythonに限らず様々なプログラミング言語では、関数は使うだけでなく、自分でオリジナルのものを作ることができます。
今回は、この「関数を作る」方法やその目的や利点を解説します。

関数を作りたい時、作りたい時とは

自分で関数を作らなくても、プログラムを作ることはできます。
それでは、関数を作る理由とはなんなのでしょうか?
それは、同じような処理を複数の箇所でするときに、同じようなコードを何度も書くのではなく、一度書いたコードを使いまわすためです。
言い換えると、関数を作るべき時とは同じようなコードを何度も書いている時です。

熟練のプログラマーなら、3回くらい同じようなコードを書いたな、と思うと関数を作りたくなってくるはずです。同じようなコードを書くということは、繰り返し同じような処理を人間が手動でやっているということです。 しかし、繰り返し同じような処理をやるのはコンピュータの方が人間より得意です。プログラムを書く大きな理由の一つがコンピュータに同じような繰り返し処理をやらせることだといっても過言ではありません。


関数の作り方

まず、Pythonにおける関数の作り方を簡単に解説します。

関数を作ることを、関数を「定義する」と言います。一般的に、pyhtonで関数を定義するときには、下のように書きます。

>>> def 関数名(引数):
>>>        return 戻り値
  • 最初にdef を書き、その後ろにスペースを空けて、関数の名前を書きます。
  • 次に、関数名の後ろに()を書いて、その中に引数の変数名を書きます。
  • 次の行からは、関数の中で実行する処理、関数の中身です。関数の中身を書く時は、まず左に4つスペースを入力してください。
  • 関数の中身の最後には、return 戻り値に指定する値 と書きます。

より詳細を正確に知りたい方は、公式ページを確認してください。

https://docs.python.org/ja/3/tutorial/controlflow.html#defining-functions

関数定義の具体例

具体をお見せしましょう。下に書いてあるのは、文字列の最初の一文字を取り出す関数saishoを作っているところです。意味が分かりますか?

>>> def saisho(mojiretsu):
>>>        return saisho[0]
  • 最初にdef を書き、その後ろにスペースを空けて、関数の名前を書きます。
    • (上の例でいうとsaishoです。)
  • 次に、関数名の後ろに()を書いて、その中に引数の変数名を書きます。
    • (上の例でいうとmojiretsuです。)
  • 次の行からは、関数の中で実行する処理、関数の中身です。関数の中身を書く時は、まず左に4つスペースを入力してください。
    • (この関数は1行しか中身がありません。”return saisho[0]”です。)
  • 関数の中身の最後には、return 戻り値に指定する値 と書きます。
    • ( この関数でいうと、”return saisho[0]”です。 )

なお、saisho[0]の意味は、変数saishoの最初の1文字を取り出す処理です。pythonの番号の数え方は0で始まります。そのため、[0]で0番目、つまり最初の1文字を取り出します。ちなみに、[1]で2番目、[2]で3番目…と続きます。
文字列から一部の文字を取り出す方法については、こちらの記事もご覧ください

この関数を作った後、使ってみる例は以下のようになります。

>>> def saisho(mojiretsu):
...     return mojiretsu[0]
... 
>>> saisho("aiueo")
'a'

この例では、関数saisho を実行しています。その時、文字列”aiueo”の引数に指定しています。すると、”aiueo”の最初の1文字である1が返ってきました。
関数を使う方法については、こちらの記事をご覧ください。

関数定義の練習

名前はtwo、引数はmojiretsuで、引数mojirestuが文字列だとして、その2番目の文字を戻り値にする関数を定義してみましょう

>>> def two(mojirestu):
...     return mojiretsu[1]
... 

このようになるのが分かりますか?ヒントはpythonでは文字列の中の文字にアクセスするときの番号は0で始まるということです。

関数を作る例

関数の作り方は上で解説しましたが、関数をどのような時に作るべきか、まだはっきりとはわからないこともあると思います。
そこで、プログラムを書いていて、関数を作るべき例と、関数を作った後のビフォーアフターの例をいくつかご紹介しましょう。

文字列の最初の文字を取り出したい

手元に、近畿地方の都道府県の名前のリストがあるとします。このたくさんの文字列のそれぞれ最後の一文字を表示するpythonコードを書きたいとしましょう。表示された「県」や「府」の数を数えると、近畿地方にいくつの府県があるか分かるというわけです。

>>> namelist = ["大阪府", "京都府", "兵庫県", "奈良県", "三重県", "滋賀県", "和歌山県"]

関数を自分で作らずに書くとすると、下のような例が考えられます。

ビフォー: 同じようなコードをたくさん書く例

>>> namelist = ["大阪府", "京都府", "兵庫県", "奈良県", "三重県", "滋賀県", "和歌山県"]
>>> name = namelist[0]
>>> print(name[-1])
府
>>> name = namelist[1]
>>> print(name[-1])
府
>>> name = namelist[2]
>>> print(name[-1])
県
>>> name = namelist[3]
>>> print(name[-1])
県
>>> name = namelist[4]
>>> print(name[-1])
県
>>> name = namelist[5]
>>> print(name[-1])
県

ステップ1: リスト namelistの要素を1つ取り出す

まず、リストの要素を一つずつ取り出します。一番最初から始めるとすると、リストの変数namelistの最初の要素を取り出すのはnamelist[0]と書きます。これは”大阪府”という文字列です。


ステップ2: 文字列の最後の文字取り出す

次に、その文字列の一番最後の文字を取り出します。ここで、リストの一番後ろの要素を取得するときは、[-1]という番号を指定できました。

リストの使い方:負のインデックス

それと同じように、文字列の一番後ろの文字を取り出したいときも、文字列の変数名[-1]と書けます。

つまり、name = namelist[0]と name[-1] で、namelistの中の最初の要素”大阪府”の最後の文字”府”を取り出すことができます。上の例ではこの文字をprintで画面に表示しています。

ステップ3: リストnamelistのすべての要素について繰り返す

ステップ2とステップ3を、大阪府以外の要素についても繰り返します。

問題

この例でも、 「近畿地方の都道府県の名前のリストの要素のそれぞれ最後の一文字を表示 する」ことはできています。しかし、print(namelist[2][-1])のようなコードを6回も書いています。各行は、[]の中の数字しか違いません。


アフター: 関数を作成して同じようなことをたくさん書かない例

上のコードで、同じようなことを書いていた個所を 関数にしてまとめましょう。

>>> namelist = ["大阪府", "京都府", "兵庫県", "奈良県", "三重県", "滋賀県", "和歌山県"]
>>> def print_one(targetlist, i):
...     name = targetlist[i]
...     print(name[-1])
...
>>> print_one(namelist,0)
府
>>> print_one(namelist,1)
府
>>> print_one(namelist,2)
県
>>> print_one(namelist,3)
県
>>> print_one(namelist,4)
県
>>> print_one(namelist,5)
県

print_oneという関数を定義し、引数にはリストと、その何番目を表示するかという番号をとります。この関数にnamelistと番号を指定して6回実行しています。

print_one関数を最初に定義する箇所が増えましたが、関数を6回実行する箇所は1行に減ったので、全体としてすっきりした構造のプログラムになりました。

今回のような例なら、関数を作らなくてもあまり変わらないようにも見えるかもしれません。しかし、もし、最後の1文字を表示していたプログラムを、最初の1文字を表示するプログラムに変更したいとしたらどうでしょうか? ビフォーの例だと、[-1]と書いてある6箇所を[0]に書き換える必要があります。アフターの例だと、関数の中の1箇所だけです。このように、関数を作るとプログラムに変更を加えることが容易になる場合があります。

<< 前へ 第11回 たくさんのデータで同じ処理を繰り返す

>> 次へ 第13回

EC2

EC2は、簡単に言うと、VPSのような仮想マシンのレンタルサービスです。
Amazonが提供するクラウド開発サービス、AWS(Amazon Web Services)の1つです。

EC2とは略語で、正式にはElastic Compute Cloudという名前です。
直訳すると、柔軟な計算クラウド、という感じでしょうか。
その名の通り、VPS等と違ってマシンの性能の上げ下げが簡単で、複数台にしたり、AWSの他のサービスを利用して、ネットワークを構成したり、
と柔軟に使用することがデキます。

例えば、様々なWebサービスを公開するために利用できます。
ちなみに、仮想マシンのOSは、ディフォルトではCentOSをベースにしたAmazon Linuxです。

デプロイ

デプロイとは、ソフトウェアを利用可能な状態にすることです。
英語では”deploy”、日本語で言うと「配置」です。

例えば、Webアプリケーション開発時に、アプリの新しいバージョンをインターネット等から利用可能なようにサーバにアップロードする時によく使います。

感覚的には、Webサイトの更新にのようなものです。

参考
https://en.wikipedia.org/wiki/Software_deployment (2017-12-03参照)

PowerPointアドインを作って、スライドをセクションごとに保存してみた

Python独学ならTech-Joho TOP > いろいろやってみた > PowerPointアドインを作って、スライドをセクションごとに保存してみた

やりたいこと

表記の通りですが、私はOffice2010あたりから追加されたパワーポイントのセクション機能を多用しています。
他にあまり使っている人を見たことがありませんが、コンテンツを文章の章のように分けたいときに便利です。

今回、セクションのあるパワーポイントのスライドの、各セクションを別ファイルとして保存する作業が必要になりました。
そこで、pptxファイルをセクションで分割保存する機能をアドインとして作りました。

マクロは比較的よく作りますが、アドインは初めてなので、その手順をメモして公開します。
言い訳しておきますが、あまり良い設計ではないかもしれません。

必要なツールのインストール

まず、開発の前に、Visual Studio 2017をインストールしました。

次に、プロジェクトを作るにあたって”Microsoft Office Developer Tools”をインストールします。
画面左上の ファイル > 新規作成 > プロジェクト
でウインドウが開くので、左下の 「Visual Studio インストーラーを開く」をクリックします。

開いた「Visual Studio インストーラー」の「製品」タブ内を下のほうにスクロールして「Office/SharePoint開発」を探し、チェックボックスにチェックを入れて、右下の「変更」を押してください。

Office/SharePoint開発のインストール

もしVisual Studioが開いていると、警告が表示されるので、Visual Studioを終了して「実行」を押してください。

インストールが始まります。

インストール完了

インストールが完了したら、「起動」を押してください。

1.プロジェクトを作る

プロジェクトを作ります。

アドインの作成

画面左上の ファイル > 新規作成 > プロジェクト > Office/SharePoint > VSTOアドイン > Powrpoint2013と2016 VTSOアドイン を選択し、名前や場所を適切に変更して、「OK」を押してください。私は「SectionSaver」という名前にしました。

ボタンのクラス

リボンにボタンを作る

まず、リボンデザイナーを使ってリボンを作ります。
画面上日のプロジェクト > 新しい項目の追加 をクリックし、開いたウインドウで、
リボン(ヴィジュアルなデザイナー)を選択して、名前は「Ribbon1.cs」にして、「追加」をクリックします。

リボンのイメージが表示されるので、左側にある「ツールボックス」を開き、「Office リボンコントロール」の中にあるButtonをイメージの適当な場所にドラッグします。

リボンのデザイン

追加したボタンを右クリックし「プロパティ」をクリックし、右下のプロパティ欄を開きます。
「表示」の中の「Label」の欄を「button1」から分かりやすい内容に変更しましょう。

ボタンの作成

次に、作成したRibbon1を、アドインの開始時に表示します。
ThisAddIn.csに、以下のコードを追加してください。

ThisAddIn.cs

        protected override Microsoft.Office.Core.IRibbonExtensibility
CreateRibbonExtensibilityObject()
        {
            
            
            return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
                    new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new Ribbon1(this.Application) });
           
        }

セクションを取得して保存する

上のイメージのペイン内にあるボタンをダブルクリックすると、Ribbon1.csのウインドウが開きます。

リボンのクラス

この中の「button1_Click」メソッドに書いた処理が、ボタンのクリック時に実行されます。
以下のように変更しましょう。

Ribbon1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using Microsoft.Office.Interop.PowerPoint;
using System.IO;

namespace SectionSaver
{
    public partial class Ribbon1
    {
        public Microsoft.Office.Interop.PowerPoint.Application application;

        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            int firstSlide;
            int slideCount;
            Presentation presentation;
            Slides originalSlides;
            SectionProperties sectionProperties;

            application = Globals.ThisAddIn.Application;
            sectionProperties = application.ActivePresentation.SectionProperties;
            originalSlides = application.ActivePresentation.Slides;

            // 保存用フォルダの準備
            var baseName = application.ActivePresentation.Path + Path.DirectorySeparatorChar + "parts" ;
            bool exists = System.IO.Directory.Exists(baseName);
            if (!exists)
                System.IO.Directory.CreateDirectory(baseName);
            baseName += Path.DirectorySeparatorChar + "my_slide";

          
            // セクションごとの処理
            for (var i = 1; i <= sectionProperties.Count; i++)
            {
                var name =  baseName + i.ToString();

                firstSlide = sectionProperties.FirstSlide(i);
                slideCount = sectionProperties.SlidesCount(i);

                presentation = application.Presentations.Add(Microsoft.Office.Core.MsoTriState.msoFalse);
               
                // 内容とデザインのコピー
                presentation.Slides.InsertFromFile(application.ActivePresentation.FullName, 0, firstSlide, firstSlide + slideCount-1);
                for (var j = 1; j <= presentation.Slides.Count; j++)
                {
                    presentation.Slides[j].Design = originalSlides[firstSlide - 1 + j].Design;
                    
                }
                application.DisplayAlerts = PpAlertLevel.ppAlertsNone;
                presentation.SaveAs(name);
                presentation.Close();



            }
            

        }
    }
}

画面上部の「開始」をクリックして、実行してみましょう。
自動的に、開発中のアドインが読み込まれたパワーポイントが起動します。

「アドイン」タブに、先ほど追加したボタンがあるのでクリックします。
admintab

無事に処理が実行され、セクションごとにファイルがわかれました。

parts files

参考

チュートリアル : 初めての PowerPoint 用 VSTO アドインの作成(microsoft公式)
https://msdn.microsoft.com/ja-jp/library/cc668192.aspx

リボンの概要(microsoft公式)
https://msdn.microsoft.com/ja-jp/library/bb386097.aspx

リボン デザイナー(microsoft公式)
https://msdn.microsoft.com/ja-jp/library/bb386089.aspx

オブジェクトモデル(microsoft公式)
https://msdn.microsoft.com/ja-jp/library/bb772069.aspx

Slides.InsertFromFile メソッド (PowerPoint)(microsoft公式)
https://msdn.microsoft.com/ja-jp/vba/powerpoint-vba/articles/slides-insertfromfile-method-powerpoint

セクション名一覧を取得するPowerPointマクロ
http://www.relief.jp/docs/013931.html