pythonのreduceとlambdaの再帰と内包表記

reduce

python3でreduceを使うにはfunctoolsのインポートが必要。

from functools import reduce

print(reduce(lambda x,y:x + y,range(1,10)))

lambdaの再帰

#階乗
f = lambda x:1 if x <= 1 else x*f(x -1)
f(3)
#総和
s = lambda l:0 if not l else l.pop() + s(l)
s([1,2,3,4,5])
#フィボナッチ数列
fib = lambda n:n if n ==0 or n == 1 else fib(n - 1) + fib(n - 2)
fib(5)
#最大公約数
gcd = lambda a,b:a if b == 0 else gcd(b,a % b)
gcd(1920,1080)

リスト内包表記

基本構文 [counter for counter in iterator]

[i**2 for i in range(10) if i % 5 == 0]
[0, 25]
#同じものをfilterとmapで書いてみる
list(filter(lambda x:x % 5  == 0,map(lambda x:x**2,range(10))))

INA226とArduinoで電流測定

Texas Instruments のデジタル電圧・電流センサ INA226 を使う こちらで紹介されていたソースを動かしてみました。 電圧値は正しく読めるのですが、恐らくモジュールが異なるのでシャント抵抗の値が違うのか電流値はテスターの電流値と異なりました。

#include <Wire.h>

// Connect INA226 with SCL (A5), SDA (A4)

const byte INA226_ADDR = B1000000;

const byte INA226_CONFIG = 0x00;
const byte INA226_SHUNTV = 0x01;
const byte INA226_BUSV   = 0x02;
const byte INA226_POWER  = 0x03;
const byte INA226_CURRENT = 0x04;
const byte INA226_CALIB  = 0x05;
const byte INA226_MASK   = 0x06;
const byte INA226_ALERTL = 0x07;
const byte INA226_DIE_ID = 0xff;

void INA226_write(byte reg, unsigned short val)
{
  Wire.beginTransmission(INA226_ADDR);
  Wire.write(reg);
  Wire.write(val >> 8);
  Wire.write(val & 0xff);
  Wire.endTransmission();  
}

short INA226_read(byte reg)
{
  short ret = 0;
  // request the registor
  Wire.beginTransmission(INA226_ADDR);
  Wire.write(reg);
  Wire.endTransmission();  

  // read
  Wire.requestFrom((int)INA226_ADDR, 2);
  
  while(Wire.available()) {
    ret = (ret << 8) | Wire.read();
  }
  
  return ret;
}

void setup() {
  Serial.begin(9600);
  while (!Serial) {}

  Wire.begin();
  // average: 16 times, conversion time: 8.244ms/8.244ms 
  INA226_write(INA226_CONFIG, 0x45ff);
  // current conversion
  INA226_write(INA226_CALIB,  2560);
}

void loop() {
  int sv, bv, c;
  float bv_;
  
  bv_ = bv = INA226_read(INA226_BUSV);
  sv = INA226_read(INA226_SHUNTV);
  c = INA226_read(INA226_CURRENT);
  
  bv_ *= 1.25;
  
  Serial.print(bv);    // bus voltage (reading)
  Serial.print(" ");
  Serial.print(sv);    // shunt voltage (reading)
  Serial.print(" ");
  Serial.print(bv_);  // bus voltage in [mV]
  Serial.print(" ");
  Serial.println(c);  // current in [mA]

  delay(100);
}

Githubへ既存のプロジェクトを追加

ローカルのプロジェクトをGitHubへアップロードする方法こちらを参考にしました>

GitHubのマイページにあるRepositoriesタブを開き、Newボタンを押下します。
リポジトリ名(プロジェクト名)を入力して、空っぽの新規レポジトリを作成しておきます。

次に、ローカルで以下を実行します。
<pre class="brush:text" title="">
# GitHubへアップロードしたいプロジェクトディレクトリへ移動
$ cd /path/to/your/project
$ git init

# 必要であれば.gitignoreを作成し、バージョン管理しないファイルやディレクトリを記載(例:*.log)
$ vim .gitignore

# プロジェクトディレクトリ内にあるファイルやディレクトリを全てコミット 
$ git add .
$ git commit -m "Initial Commit"

# 先ほど作成したGitHubリポジトリのURLをコピー&ペーストして、リモートブランチとして設定
git remote add origin https://github.com/your-name/project-name.git

# ローカルのファイルをアップロード
git push -u origin master