ボックス について

性別:男性 考えていること、思っていることを文章にしていきます。

Python グローバル変数 global変数

global変数のやり方がいまいち良く分かっていない。

main()の外で変数の定義をすればよいのだろうか・・・

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-


a = 1

def main():


    def y():
        global a
        print(a)

    b = 1

    def x():
        global b
        print(b)

    y()
    x()


if __name__ == '__main__':
    main()

 

Traceback (most recent call last):
  File "C:/Users/devel.MASTRE/PycharmProjects/Tkinter/test2.py", line 27, in <module>
    main()
  File "C:/Users/devel.MASTRE/PycharmProjects/Tkinter/test2.py", line 23, in main
1
    x()
  File "C:/Users/devel.MASTRE/PycharmProjects/Tkinter/test2.py", line 19, in x
    print(b)
NameError: name 'b' is not defined

Process finished with exit code 1

この書き方だとaはグローバル関数になっていて、bは定義されていない。

変数はどこで定義すればいいのだろう?

Python tkinter スケール f文字列

お気楽 Python/Tkinter 入門でtkinterについて勉強中。 http://www.geocities.jp/m_hiroi/light/pytk01.html#chap02 16進数の扱い方で詰まった。 f”の使い方が少し分かった。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tkinter import *


def main():

    # メインウィンドウ
    root = Tk()

    # スケールの値を格納
    red = IntVar()
    red.set(0)

    blue = IntVar()
    blue.set(0)
    green = IntVar()
    green.set(0)

    # ボタンの背景色を変更
    def change_color(n):
        color = f'#{red.get():02X}{blue.get():02X}{green.get():02X}' # f'{変数:桁数n進数}' 桁数とn進数はくっつけてよい
        button.configure(bg=color)
        # print(f'#{red.get():02X}{blue.get():02X}{green.get():02X}')

    # ボタン
    button = Button(root, text='Button', bg='#000')
    button.pack()

    # スケール
    s1 = Scale(root, label='red', orient='h', from_=0, to=255, variable=red, command=change_color)
    s2 = Scale(root, label='blue', orient='h', from_=0, to=255, variable=blue, command=change_color)
    s3 = Scale(root, label='green', orient='h', from_=0, to=255, variable=green, command=change_color)

    # ウィジェットの配置
    s1.pack(fill="both")
    s2.pack(fill="both")
    s3.pack(fill="both")

    # メインループ
    root.mainloop()


if __name__ == '__main__':
    main()
GUIが簡単?に作れるから初心者でも楽しい。
今のところ・・・



Pycharm 覚え書き

・.exeの場所(デフォルト)

C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3.1\bin

これで、デフォルトでは32bitのexeが実行されるが、この場所にある64bitのexeのショートカットを作ることで、64bitのPycharmをショートカットから実行することができる。

 

・コードテンプレート

File -> Settings… ->Editor -> Code Style -> File and Code Templates -> Python Script

このコードをコピペすると最後に改行が入らないため、貼り付けた後に改行を入れる。

改行を入れないと、

W292 no newline at end of file # 最後に改行が無いという警告

が出てしまう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by ${USER} on ${DATE}.




def main():
    

if __name__ == '__main__':
    main()
# Created by ${USER} on ${DATE}.

でユーザ名と一番最初の作成日時を書き入れられる。(pycharmで作成した場合のみ)

・フォント・文字サイズ

File -> Settings… -> Editor -> Colors & Fonts -> Font

この場所でエディタのフォントなどを変更できる。

私は、MeiryoKe_Gothicを使っている。(自分でフォントをインストール?する必要あり)

 

File -> Settings… -> Editor -> Colors & Fonts -> Console Font

この場所でコンソールのフォントなどを変更できる。

私は、文字サイズを20くらいにしている。

 

・カラースキーム

“Solarized light”を使っている。

このサイトから対応しているエディタ・IDEのリンクを選択しダウンロードする。

解凍したファイルから.jarを

File -> import setting で読み取る。

そのあとに

File -> Settings… -> Editor -> Color & Font

Schemeで設定を変更する。

 

 

・ユニットテスト

ワーキングフォルダで Alt + insert、python Fileを選択。出てきたウィンドウのkind:の部分をunittstに変更。名前を入力してOKを押すとユニットテストのファイルが作成できる。

 

・Postfix Completion

これを使うとコードの入力が楽になる。

a.ifと入力すると、自動で

if a:

と変換してくれる。

https://www.jetbrains.com/help/pycharm/2016.3/postfix-completion.html

 

・デバッカがうまく動かないとき(2017/04/07 Pycharm 2017.1)

対症療法。自分でもよくわかっていない。

SettingからPython Debuggerを検索。

PyQt comatibleからGevent compatibleに変更する。

 

Python Updating a Spreadsheet

# !/user/bin/env python
# - Corrects costs in produce sales spreadsheet.

import openpyxl


def main():
    wb = openpyxl.load_workbook('produceSales.xlsx')
    sheet = wb.get_sheet_by_name('Sheet')

    # The produce types and their updated prices

    PRICE_UPDATES = {'Garlic': 3.07,
                     'Celery': 1.19,
                     'Lemon': 1.27}

    # Loop through the row and update prices.
    for rowNum in range(2, sheet.get_highest_row()):
        produceName = sheet.cell(row=rowNum, column=1).value # 指定したセルの中身を取り出している
        if produceName in PRICE_UPDATES:
            sheet.cell(row=rowNum, column=2).value = PRICE_UPDATES[produceName]

    wb.save('updatedProduceSales.xlsx')
    print('Done')



if __name__ == '__main__':
    main()

エクセルでセルの中から変更したい項目を探して、値を変えるスクリプト。

 

 

 

Python Reading Data from a Spreadsheet

# !/user/bin/env python
# - Tabulates population and number of census tracts for each country

import openpyxl, pprint


def main():
    print('Opening Workbook...')
    wb = openpyxl.load_workbook('censuspopdata.xlsx')
    sheet = wb.get_sheet_by_name('Population by Census Tract')
    countyData = {}

    # Fill in countyData with each country's population and tracts.
    print('Reading rows...')

    for row in range(2, sheet.get_highest_row()+1):
        # Each row in the spreadsheet has data for one census tract.
        state = sheet['B' + str(row)].value
        county = sheet['C' + str(row)].value
        pop = sheet['D' + str(row)].value

        # Make sure the key for this state exist.
        countyData.setdefault(state, {})
        # Make sure the key for this county in this state exists.
        countyData[state].setdefault(county, {'tracts':0, 'pop':0})
        # Each row represents one census tract, so increment exist.
        countyData[state][county]['tracts'] += 1
        # Increase the county pop by the pop in this census tract.
        countyData[state][county]['pop'] += int(pop)
    # open a new text file and write the contents of countyData to it.
    print('Writing results...')
    with open('census2010.py', 'w') as resultFile:
        resultFile.write('allData = ' + pprint.pformat(countyData))

    print('Done')

if __name__ == '__main__':
    main()

スプレッドシートを読み込んで、.pyに辞書型でデータを保存するスクリプト。

 

 

 

Python “I’m Feeling Lucky” Google Search

# !/user/bin/env python
# - opens several Google search results.

import requests, sys, webbrowser, bs4


def main():
    print('Googling...') # display text while downloading the Google page
    res = requests.get('http://google.com/search?q=' + ' '.join(sys.argv[1:]))
    res.raise_for_status()

    # Retrieve top search result links.
    soup = bs4.BeautifulSoup(res.text, 'html.parser')

    # Open a browser tab for each result.
    linkElems = soup.select('.r a')
    numOpen = min(5, len(linkElems))
    for i in range(numOpen):
        webbrowser.open('http://google.com' + linkElems[i].get('href'))


if __name__ == '__main__':
    main()

コマンドラインで実行するときに、

python lucky.py 箱庭

などとして実行するとgoogleで検索した結果の上位5までを新しいタブで開くスクリプト

この場合は、箱庭の検索結果から5つタブが開かれる。

やる気と継続

やる気がないと何もできないという言葉がある。そもそもやる気とは何なのだろうか。これがあると物事がうまくいって成果がでる?なければ何もならない?

自分の定義では、楽しいや達成感が得られること、行動、これを結果としてやる気と呼ぶのではないか。実際に行動して色々試してみて、上手くいったり、いかなかったり・・・。繰り返しを楽しめるのもやる気の一つではないかと思う。

 

大切なのは継続かなー。それを自分に言い聞かせて実行してみよう。

ゆうメールのこと

http://www.post.japanpost.jp/service/yu_mail/

 

ゆうメールを初めて使ったけど便利。

書類や雑誌などの薄いものを送る場合(3kg以下)では、安いし(180~610円)であり手軽に送ることができる。サイズや重さで変わるかもしれないがクロネコやヤマトよりは安くて速いはず。<-調べていない。送るものによって使い分けが良い。

最近はメールがメインでそれで済んでしまうから書類を送るときなどは何が便利で安いかを知っておいた方が大事。

 

 

必要な書類の締め切りがぎりぎりになってから書類を送ったから、もっと早くやっていればという反省・・・

コンスタントにやっていく

継続は力なり。

言葉でいうのは簡単だけど難しいことだ。

ちょくちょく更新しているブログでも、毎日できているわけではない。

ましてや仕事や勉学でも毎日やれることは少ないのではないか。

継続する仕組みを作るのがいいのか。調子が良くなくてもとりあえず始めるのが良いか。

今、タイマーをセットしてブログを書いている。ある本によると18分で区切って仕事をするとよいという。

中途半端な数字ではあるが、時間が短いから物足りなくはならず、長いから飽きてくる時間も少ない。

自分は、ちょっと長く感じるし、集中力もそこまであるわけでないので7分でやっている。意外とあっという間に過ぎてしまう。自分に合った時間を見つけていくのが大事だと思う。短くなってもよいし、長い時間に変えてもよい。

どんな形であれ成果を出すことが大切だから。

 

ブログを書くことは脳のウォーミングアップになっていいかも。老人みたいなことを言っている。まぁ、アウトプット量が明らかに足りていないから訓練にもなっているのだろう。

しかし、みんなはどうしてあんなに文字が書けるのだろう。しかもうまいし、丁寧で分かりやすい。自分の感じたままに文書にしていくことが今の目標。うまく書こうとするとうまく書けないだろうし、丁寧にしようとしても丁寧にならない。文字だけではなく、スポーツ、趣味、勉学、仕事のどれについても通じるものがありそう。

まぁ、最初の一歩だけを踏み出すことが大事!

かっとびんぐ!