2018-01-13
Każdy obiekt ma swój typ i pewne właściwości. Jedną z tych właściwości jest informacja, czy obiekt można wywołać (dziwnie to brzmi po polsku „jest wywoływalny” więc będę używał „is callable”). Oczywiście funkcje są przykładem obiektów wywoływalnych. Zobacz:
def f_just_print_1():
return 1
print('is function callable? ', callable(f_just_print_1))
x=123
print('is integer callable? ',callable(x))
Jak to uruchomisz to zobaczysz, że funkcja jest callable a liczba nie - logiczne.
Ale funkcja coś zwraca. W naszym przypadku zwraca liczbę. Czy liczba jest callable?
print('is result of function callable? ',callable(f_just_print_1()))
Jak uruchomisz ten przykład to zobaczysz, że nie. Funkcja się wywołała, zwróciła liczbę a liczba już nie jest callable. Nadal logiczne.
Ale – co by było, gdyby funkcja zwróciła obiekt funkcji? To bardzo dziwne, ale popatrz na taki prosty przykład:
def DoOperation(OperationType):
def PLUS(a,b):
return a+b
def MINUS(a,b):
return a-b
if OperationType == 'ADD':
return PLUS
else:
return MINUS
Mamy funkcję, która jako argument przyjmuje napis OperationType
- jeśli OperationType to napis „ADD” to zostanie zwrócona funkcja PLUS, która z kolei przyjmuje dwa argumenty a i b. Funkcja PLUS dodaje te liczby
- jeżeli OperationType to cokolwiek innego, to zostanie zwrócona funkcja MINUS, która z kolei przyjmuje dwa argumenty a i b. Funkcja MINUS odejmuje te liczby
Czy to co zwraca funkcja DoOperation jest callable?
print('is this callable? ',callable(DoOperation('ADD')))
Jeśli uruchomisz powyższą linijkę to zobaczysz, że tak. To skoro wynik zwracany przez funkcję można wywołać to co się stanie przy takim zapisie:
print('result of operation ADD: ',DoOperation('ADD')(3,1))
print('result of operation SUBSTRACT: ',DoOperation('SUBSTRACT')(3,1))
- DoOperation(’ADD’)(3,1) – najpierw wywołaliśmy DoOperation, która zwróciła funkcję PLUS, a potem funkcja PLUS uruchomiła się z argumentami 3 i 1 i wynik to 4
- DoOperation(’SUBSTRACT’)(3,1) – najpierw wywołaliśmy DoOperation, która zwróciła funkcję MINUS, a potem funkcja MINUS uruchomiła się z argumentami 3 i 1 i wynik to 2
Oczywiście można by to zrobić też tak:
myNewFunction = DoOperation('ADD')
print('result is ',myNewFunction(3,1))
ale ten zapis rozciąga się na 2 linijki, a notacja o którą pytasz jest bardziej kompaktowa.
O funkcji callable:
https://www.programiz.com/python-programming/methods/built-in/callable
Inny przykład bazujący na definicji klasy i wywołania metody klasy:
https://stackoverflow.com/questions/111234/what-is-a-callable-in-python
Różnie programiści korzystają z tej notacji. Znajdziesz ją między innymi w Keras:
https://keras.io/getting-started/functional-api-guide/
zwróć uwagę na komentarz:
# a layer instance is callable on a tensor, and returns a tensor
w tym fragmencie:
from keras.layers import Input, Dense
from keras.models import Model
# This returns a tensor
inputs = Input(shape=(784,))
# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)
# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(data, labels) # starts training
2018-01-13
Jak wiele rzeczy w PowerShellu można to zrobić na dziesiątki sposobów. Poniżej kilka propozycji:
a to tylko kilka propozycji, bo tablicę można jeszcze zainicjować wczytując zawartość pliku, zapisując w zmiennej wynik innego polecenia zwracającego większą liczbę obiektów itp.
Pierwszy z pokazanych powyżej sposobów jest chyba również najprostszy. $t1 składa się z liczb od 1 do 5
Drugi przypadek jawnie podkreśla, że chodzi o listę. Mówi o tym nawias i znak@ przed nim. Zapis ten jest szczególnie przydatny jeżeli lista ma być pusta @() lub jednoelementowa @(1). Bez tej notacji nic nie można by powiedzieć o tym, że coś jest pustą listą albo listą jednoelementową.
Trzeci przypadek, to właściwie powtórzenie drugiego z tym, że tutaj elementy listy to napisy. Optycznie taka lista prezentuje się tak samo, ale poszczególne elementy listy mają różne typy, a co za tym idzie również właściwości i metody
2018-01-12
2018-01-12
1. Najpierw uruchamiasz anaconda prompt, a w nim wykonujesz:
jupyter notebook –generate-config
2. Ta komenda wyświetli nazwę pliku konfiguracyjnego
3. Teraz wyedytuj ten plik w notatniku u mnie:
notepad „C:\Users\rafal\.jupyter\jupyter_notebook_config.py”
4. W tym pliku szukasz wpisu:
#c.NotebookApp.notebook_dir
Odkomentowujesz znak # z przodu i podajesz ścieżkę dostępu do katalogu, który ma być domyślnie owierany. U mnie:
c.NotebookApp.notebook_dir = 'C:\\Users\\student\\Python-02-PL\\Examples’
5. Zapisujesz plik i uruchamiasz jupyter notebook jeszcze raz.
Przy okazji zobacz ile tam jest opcji 🙂
2017-12-31
W skrypcie próbowałem skorzystać z pydot. Linijka
import pydot
kończyła się błędem o braku tej biblioteki. Pestka!
- Jeśli pracujesz np z IDLE i ścieżka systemowa wskazuje właśnie na tą instalację Pythona to problem rozwiązuje się przez uruchomienie w wierszu poleceń (pamiętaj o run as administrator):
pip install pydot
- Jeśli pracujesz z Anaconda i ta instalacja nie jest wskazywana przez zmienną systemową PATH, to aby zainstalować bibliotekę pydot wejdź do Anaconda Prompt (Start >> Anaconda Prompt) – znowu pamiętaj o uruchomieniu komendy jako administrator. Tu również wystarczy uruchomić
Czytaj dalej »
2017-12-20
Już teraz na Udemy dostępny jest kurs „SQL #4: Modyfikacja danych, transakcje i obsługa błędów”. Szkolenie składa się z ponad 4 godzin nagrań video i przez kilka pierwszych dni jest dostępne za darmo!
Szkolenie
- szczegółowo omawia polecenia INSERT, UPDATE, DELETE
- przedstawia jak pracować z transakcjami
- omawia rodzaje locków zakładanych podczas modyfikacji danych
- prezentuje transaction isolation level
- uczy jak obsługiwać błędy, również te do których dochodzi w transakcjach
… a do tego zawiera mnóstwo laboratoriów, więc nie czekaj tylko zapisz się już teraz klikając w obrazek poniżej! Przy okazji sprawdź też inne nasze kursy:
2017-12-16
Już niebawem na Udemy dostępny będzie kurs „SQL #4: Modyfikacja danych, transakcje i obsługa błędów”. Szkolenie składa się z ponad 4 godzin nagrań video i przez kilka pierwszych dni będzie dostępne za darmo!
Informacja o udostępnieniu kursu pojawi się na tym blogu. Jeżeli chcesz być poinformowany o dacie premiery – zasubskrybuj bloga już dzisiaj!
Kurs ma na celu dokładne przedstawienie modyfikacji danych. Widziałem już wiele szkoleń, gdzie autor poświęcał na polecenie INSERT jedną 5 minutową lekcję, gdzie uczył jak wstawić rekord. Tutaj na same polecenie INSERT jest przeznaczone aż 11 lekcji o łącznym czasie 70 minut. Pokazuję nie tylko jak wstawić rekord, ale jakie problemy mogą przy tym wystąpić, jak pracować z IDENTITY, SEQUENCE, wartościami domyślnymi, jak naprawić IDENTITY, obalam mit o unikalności identity, pokazuję jak kopiować rekordy poleceniem SELECT INTO, INSERT SELECT czy INSERT EXEC. Kawał porządnej SQL-owej wiedzy, tak by się tego nauczyć i nie musieć już na własną rękę szukać więcej materiałów. Podobnie jest z UPDATE i DELETE.
Kolejna część to transakcje i obsługa błędów. Wielu programistów unika transakcji, a jeśli się na nie decyduje to często używa ich „na intuicję”, a tymczasem na tej intuicji można nieźle popłynąć. Dlatego z lekcji na lekcję pogłębiamy temat, aby w końcu pokazać najlepsze praktyki w pracy z transakcjami i obsługą błędów.
Unikalna część kursu to Transaction Isolation Level. Każdy z poziomów izolacji transakcji jest opisany oddzielnie i ostatecznie porównany z pozostałymi. Po ukończeniu kursu nie powinieneś mieć problemów ze zrozumieniem co i dlaczego zostało zablokowane oraz jak używać transakcji.
Póki co zapoznaj się z informacją o aktualnie dostępnych kursach: https://www.mobilo24.eu/kursy/